わかった。何が原因なのか完全にはわかりませんが、関連していると思われる要因を説明しようと思います。誰かが助けてくれることを願っています! また、不足している可能性のあるものについては、喜んでお答えします。問題のコードを簡単に説明すると、次のようになります。
- ITextSharp を使用して、PDF でいっぱいのフォルダー内のページ数などを確認します。
- スレッド化に task.factories を使用します (基本的に、メイン サブは「pdf カウント」サブを呼び出し、カウント サブは interlocked.add を使用してページをパブリック変数に追加します)。
- 私は非常によく似たプロセス (別のライブラリを使用) を使用して、Tiff ファイルに対して同じことを行います。同じ問題はないようです。
- 最初にプログラムを閉じずに (ファイルを再度カウントするだけで) プログラムを再実行すると、タスク マネージャーのメモリ使用量は最初は少し減少しますが、最終的には前回の反復よりも高くなります。それには上限があるようですが、実際にはテストしていません。
- プログラムが完了すると、プロセッサの使用率は通常に戻ります。
私が遭遇した問題は、タスク マネージャーでプログラムに割り当てられたメモリが、これを行っているときに非常に急速に不均衡に大きくなることです (これを実行すると、通常は 300 ~ 700 mb になります)。数百のファイルを処理します)。また、プログラムが「完了」してフォームに結果を表示するだけの場合でも、そのレベルのメモリ使用量を維持し続けます。タスク、スレッドなどを見ると、プログラムが「完了」すると、すべて正常に見えます。しかし、何らかの形で、何かがまだメモリのどこかに保存されているようです。
サブが終了したときにガベージコレクションがクリーンアップを処理する必要があるというのは、私の漠然とした理解ですよね? 次のような単純な Using ステートメントを実行しようとしても、
Using PDFDocx As PdfReader = New PdfReader(PDFToCount)
Dim Pges As Integer = PDFDocx.NumberOfPages
Interlocked.Increment(Pges)
End Using
まったく違いがないようです。マネージド コードとアンマネージド コードの全体的な理解は、せいぜいあいまいです。この DLL は管理されていないコードを構成しますか? もしそうなら、それはどういうわけか問題ですか? タスク マネージャーでのメモリ割り当ては、どういうわけか目の錯覚ですか? または、私のようにタスク ライブラリを使用していることが問題の原因である可能性はありますか? 私はこれがすべて少しあいまいであることを理解しています.私は喜んでできる限りの情報を記入します.
編集: フォローアップとして、この記事http://www.codeproject.com/Articles/42721/Best-Practices-No-5-Detecting-NET-application-memoを使用して、DebugDiag を使用し、その結果を得ることができました。次のことを示しているようです:
Function clr!CExecutionEngine::ClrVirtualAlloc+4a
Source Line
Allocation type Virtual memory allocation(s)
Allocation Count 12 allocation(s)
Allocation Size 1.8 GBytes
Leak Probability 50%
問題の責任者です。新しい情報に基づく提案はありますか?