私は、社内のC#プログラムを書いています。これは主に他のAPIに依存するさまざまなファイル形式間のバッチ変換です。現在、UIはコンバージョンを処理するBackgroundWorker(スレッドではない)を生成し、ワーカーがジョブを完了すると空になるリクエストをキューに入れます。キューオブジェクト自体は非常に小さく(作業者に何をすべきかを伝える3つの文字列)、プログラムのメモリフットプリントに大きく寄与しません。私は自分のメモリ管理について非常に厳しい経験をしています(画像を処理し終わった時点で特定のポイントで手作業でガベージコレクションを行います)。しかし、プログラムは一度に約100 MBのメモリを使用する傾向があり、合計CPU時間。私は素朴にスレッディングを実装していたように思えますが、CLRが何らかの魔法を知らない限り、すぐにシステムメモリが使い果たされてしまうようです。マルチスレッドアプリケーションのメモリ不足の防止
スレッドを防ぐための簡単で効率的な方法はありますかシステムはOutOfMemory例外をキャッチし、死んだスレッドをロールバックする以外にメモリが不足することはありません(非常に非効率的ですが、膨大な量のメモリを使用せずに状態を保持する方法はありません)。
私たちは何スレッドを話していますか? UIと1人のワーカーが言及していますが、それは大きな問題ではありません。たくさんのスレッドを産んでいますか? –
私は1つのBackgroundWorkerオブジェクト(スレッドではない)を現在持っています。私はより多くのCPU使用率を許可するが、システムのメモリ不足を防ぐために、さらに追加したいと思います。私が言ったように、1人のワーカーがいるUIには最大100 MBのRAMが必要なので、さらにスレッドを追加することも問題になるかもしれません。バッチジョブは日常的に100ファイルを超えることができます。 – pschorf