Fechar uma importação DLL C # / C ++ ou pelo menos desalocar sua memória heap? [fechado]

Jan 15 2021

Eu tenho um aplicativo C # .NET Framework que chama uma DLL C ++ não gerenciada via DLLImport, para analisar um monte de arquivos fornecidos pelo usuário e executar algumas operações.

Eu gostaria de ter uma barra de progresso em meu aplicativo C #, pois a análise deste arquivo pode ser um processo longo. A melhor maneira que pensei para fazer isso é analisar alguns arquivos por vez e, em seguida, retornar ao código C # para que eu possa atualizar a barra de progresso.

No entanto, isso exige que eu aloque alguma memória no heap da DLL C ++ para que não precise passar todos os mais de 10.000 caminhos de arquivo como argumentos sempre que precisar chamar a função C ++ novamente.

Não tenho certeza se é possível fechar a DLL depois de concluir minha análise. Existe alguma outra maneira de realizar essa tarefa sem ter que manter todos os caminhos na memória alocados durante todo o tempo de execução do aplicativo?

Respostas

3 RomanPolunin Jan 15 2021 at 05:35

Uma vez que você confirmou que os arquivos são independentes, você deve tentar paralelizar a operação.

No lado do produtor do processo, configure uma lista ou uma matriz com nomes de arquivo. Se a lista ficar muito grande (realmente, REALMENTE grande para estressar a RAM disponível), você pode querer substituí-la por uma combinação de BlockingCollection e uma Queue, para que o produtor possa ser estrangulado até que o número de itens no canal de processamento esteja abaixo do limite .

No outro lado desse tubo, inicie um trabalhador (embutido ou como thread de trabalho separado) que irá ler sequencialmente ou .AsParallel () os itens da coleção e passá-los para a biblioteca não gerenciada para processamento.

Como este é um aplicativo de IU, acho que seu thread de trabalho deve ser separado. Em cada arquivo processado, faça um .Invoke () no formulário da IU para atualizar a barra de progresso.