2009-06-04 7 views
1

General Recommendations#3の意味は何ですか?マネージドスレッディング一般推奨事項#3

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

例で説明できますか?

- 出典:MSDN - Managed Threading Best Practices

答えて

2

基本的に、ワーカースレッドに作業を委ねる方法は2つあります。 1つは、作業項目をキューに格納することです。作業が終わったら、それを待ち行列にプッシュして作業員に知らせます。あなたのワーカースレッドは、次のようになります。

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

これは、推奨事項に従うと思われるアプローチです。

もう1つの方法は、ワーカーのキューを維持することです。作業が必要なときは、作業者を待ち行列から取り出し(または空の場合は作業者を作成)、アイテムを実行するように指示します。この第2のアプローチは、コード化がより困難であり、概して効率が低い。

+0

このブロッキングスレッドのシナリオでMonitor.PulseAll()は何を使用していますか?私はMS推薦の最後の文を指しています。 – aschoenebeck

+0

これは実際にはかなり奇妙な文章です。 Monitor.PulseAllは、Monitor.Waitの呼び出しでブロックされたスレッドをスリープ解除する方法です。私は正直言って、彼らが何を運転しているのか分からない。たぶん、あなたはモニター待機/パルスのセマンティクスを使用することを勧めているだけかもしれません。 –

1

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

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

0

この推奨事項は、スレッドの作成を参照してから、実行時を制御するためにSuspendResumeなどのメソッドを繰り返し呼び出すことを指していると思います。

一般的には、スレッドが実行されるべき多くの作業がある場合、スレッドを合図する(ManualResetEventまたはいくつかの同様のプリミティブのような)プリミティブロックのいくつかの種類が含まwhileループを実行させる、より良い形であると考えられます。

関連する問題