1

一般勧告 #3 のこれはどういう意味ですか?

メイン プログラムからワーカー スレッドの実行を制御しないでください (イベントを使用するなど)。代わりに、ワーカー スレッドが作業が利用可能になるまで待機し、それを実行し、終了時にプログラムの他の部分に通知するようにプログラムを設計します。ワーカー スレッドがブロックされない場合は、スレッド プール スレッドの使用を検討してください。Monitor.PulseAll は、ワーカー スレッドがブロックされる状況で役立ちます。

誰かが例で説明できますか?

-- ソース: MSDN - マネージド スレッディングのベスト プラクティス

4

3 に答える 3

2

さて、あなたがあなたのワーカースレッドに仕事をすることができる基本的に2つの方法があります。1つは、作業項目をキューに格納することです。やるべき仕事があるとき、あなたはそれをキューに押し込み、労働者に合図します。ワーカースレッドは次のようになります。

while( !quit ) {
    WaitForWork();
    GetWorkItem();
    ExecuteWorkItem();
}

推奨事項によれば、これはあなたがとるべきアプローチです。

もう1つのアプローチは、ワーカーのキューを維持することです。実行する必要のある作業がある場合は、キューからワーカーを取得し(または、空の場合はワーカーを作成し)、アイテムを実行するように指示します。この2番目のアプローチはコーディングがより難しく、一般的に効率が低くなります。

于 2009-06-09T04:46:20.127 に答える
1

これは、タスクを処理する (ファイルを保存するなど) ワーカー スレッドを手動で作成するのではなく、タスク/ジョブと既存のワーカーをキューに入れることができるシステムを用意する (またはThreadPool.QueueUserWorkItemを使用する) べきであることを意味します。タスクが到着するのを待っています (おそらく、モニターの Wait または AutoResetEvent を使用します)。このようにすると、スレッドを絶えず作成して破棄する必要がなくなり、スレッドを再利用できるようになります。

.NET 4.0 には、このスタイルのプログラミングを容易にする一連のサポート クラスを備えた新しい組み込みのTaskクラスがあり、プロジェクトごとにこれを再発明する必要はありません。

于 2009-06-04T15:22:27.647 に答える
0

Suspendこの推奨事項は、スレッドを作成し、その上でや などのメソッドを繰り返し呼び出しResumeて、いつ実行するかを制御することにも言及していると思います。

while一般に、スレッドに何らかのロック プリミティブ (ManualResetEventや類似のプリミティブなど) を含むループを実行させて、さらに処理が必要な場合にスレッドに通知する方が良いと考えられています。

于 2009-06-05T02:08:19.633 に答える