Chiudere un C # / C ++ DLLImport o almeno deallocare la sua memoria heap? [Chiuso]

Jan 15 2021

Ho un'applicazione .NET Framework C # che chiama una DLL C ++ non gestita tramite DLLImport, per analizzare un gruppo di file forniti dall'utente ed eseguire alcune operazioni.

Vorrei avere una barra di avanzamento sulla mia applicazione C #, poiché l'analisi di questo file potrebbe essere un processo lungo. Il modo migliore in cui ho pensato di farlo è analizzare un paio di file alla volta, quindi tornare al codice C # in modo da poter aggiornare la barra di avanzamento.

Tuttavia, questo mi richiede di allocare un po 'di memoria nell'heap della DLL C ++ in modo da non dover passare tutti i 10.000+ percorsi di file come argomenti ogni volta che devo chiamare di nuovo la funzione C ++.

Non sono sicuro che sia possibile chiudere la DLL dopo aver completato l'analisi. Esiste un altro modo per eseguire questa attività senza dover mantenere tutti i percorsi in memoria allocati per tutto il tempo in cui l'applicazione è in esecuzione?

Risposte

3 RomanPolunin Jan 15 2021 at 05:35

Poiché hai verificato che i file sono indipendenti, dovresti provare a parallelizzare l'operazione.

Sul lato produttore del processo, impostare un elenco o un array con i nomi dei file. Se l'elenco diventa troppo grande (davvero, DAVVERO grande, quindi sottolinea la RAM disponibile), potresti volerlo sostituire con una combinazione di BlockingCollection e una coda, in modo che il produttore possa essere limitato fino a quando il numero di elementi nel tubo di elaborazione non è inferiore alla soglia .

Dall'altro lato di questa pipe, avvia un worker (inline o come thread di lavoro separato) che leggerà sequenzialmente o .AsParallel () gli elementi dalla raccolta e li passerà alla libreria non gestita per l'elaborazione.

Poiché si tratta di un'applicazione dell'interfaccia utente, immagino che il thread di lavoro dovrebbe essere separato. Su ogni file elaborato, eseguire un .Invoke () sul modulo dell'interfaccia utente per aggiornare la barra di avanzamento.