C#/ C ++ DLLImportを閉じるか、少なくともヒープメモリの割り当てを解除しますか?[閉まっている]
を介してアンマネージC ++ DLLを呼び出すC#.NET FrameworkアプリケーションがありDLLImport
、ユーザーから指定された一連のファイルを解析して、いくつかの操作を実行します。
このファイルの解析は長いプロセスになる可能性があるため、C#アプリケーションにプログレスバーを表示したいと思います。これを行うために私が考えた最善の方法は、一度に2つのファイルを解析してから、C#コードに戻って、プログレスバーを更新できるようにすることです。
ただし、これにはC ++ DLLのヒープにメモリを割り当てる必要があるため、C ++関数を再度呼び出すたびに10,000以上のファイルパスをすべて引数として渡す必要はありません。
解析が完了した後でDLLを閉じることが可能かどうかはわかりません。アプリケーションが実行されている間ずっと割り当てられたメモリ内のすべてのパスを保持する必要なしに、このタスクを実行できる他の方法はありますか?
回答
ファイルが独立していることを確認したので、操作を並列化してみてください。
プロセスのプロデューサー側で、ファイル名を使用してリストまたは配列を設定します。リストが大きくなりすぎた場合(実際には非常に大きく、使用可能なRAMに負荷がかかる場合)、BlockingCollectionとQueueの組み合わせに置き換えて、処理パイプ内のアイテム数がしきい値を下回るまでプロデューサーを調整できるようにすることができます。 。
このパイプの反対側で、ワーカーを開始し(インラインまたは個別のワーカースレッドとして)、順次または.AsParallel()がコレクションからアイテムを読み取り、それらをアンマネージライブラリに渡して処理します。
これはUIアプリケーションなので、ワーカースレッドは分離する必要があると思います。処理されたファイルごとに、UIフォームで.Invoke()を実行して、プログレスバーを更新します。