4

バックグラウンドで多くのスレッドを実行するアプリケーションをコーディングしています。これらのスレッドはメイン スレッドに報告する必要があるため、インターフェイスのテーブルを更新できます。以前は、ワーカー スレッドは、次のようなものを使用してメイン スレッドから実行した通常の個別のクラス (Citizen という名前) でした。

new Thread(new ThreadStart(citizen.ProcessActions)).Start();

ここで、ProcessActions 関数は、すべてのバックグラウンド作業を行うメイン関数でした。実際にスレッドを開始する前に、イベント ハンドラーを登録して、Citizen スレッドがインターフェイスにログを記録/レポートできるようにします。通常、これらの Citizen スレッドは数十 (約 50) あり、それらはかなり大きなクラスです。それぞれに独自の HTTP クライアントがあり、Web を閲覧します。

これはスレッドを管理する良い方法ですか? 率直に言って、おそらくそうではありません。スレッドが正常に終了していないことは確かです。ProcessActions 関数が完了したら、イベント ハンドラーを削除します。それだけです。新しい Citizen が起動するたびに、メモリ使用量が増加し続けます。

頻繁に通信する必要がある多くの (50 以上の) スレッドを管理するための最良の方法は何でしょうか? 他のスレッドからアクセスするのではなく、独自のスレッドであるため、Citizen 変数のスレッド セーフについてあまり心配する必要はないと思います。

4

1 に答える 1

2

あなたが探しているのはスレッドプールだと思います。 これに関する MSDN の記事は、C# 4.0 で利用できるはずです。

アイデアは、スレッドプールを作成し、そのカウントをいくつかの高い数値 (たとえば 50) に設定してから、タスクへのスレッドの割り当てを開始することです。プールを拡張する必要がある場合は拡張できますが、事前に大きな数を宣言することで、高価なスレッドの作成をすべて回避できます。

実行したいタスクを「キューに入れ」、スレッドが使用可能になったときにそれらのタスクを割り当てると便利な場合があります。

また、メモリ リークを見つけるのは難しい場合がありますが、単純なケースをテストすることから始めます。すべてのスレッドを取り出し (メイン スレッドから Citizen を 1 つずつ実行するだけです)、長時間実行させます。それでもメモリ リークが発生する場合は、スレッド管理に問題はありません。

于 2013-07-30T15:04:54.560 に答える