2016-12-03 13 views
0

データD1、D2、D3を待っている3つのスレッドT1、T2、T3があるとします。データは別のスレッドによって提供されます。スレッドを一時停止するにはどうすればいいのでしょうか。(A)データを手元に置いておくか、別のアプローチとして、私はどのようにして3つのスレッドに1つのループチェックを実行させ、受信したデータに基づいてスレッドを続行する

もう少し具体的にするために、D2が利用可能であると仮定し、解(A)スレッドT2は続行しなければならず、解法(B)は3つすべて継続し、それらのためでなければ、再び失速を確認してください。

私は、データのキーと各スレッドのAutoResetEventを持つ辞書でこれを解決できると知っていますが、それは非常にエレガントではありません...よりエレガントな方法はありますか?

ありがとうございます!

エドウィン。

+1

lock (_locker) while (<blocking-condition>) Monitor.Wait (_locker); 

あなたがブロッキング条件を変更する(または潜在的に変更)するたびに、このコードが含まれますデータに基づいています。 [BlockingCollection ](https://msdn.microsoft.com/en-us/library/dd267312(v=vs.110).aspx?cs-save-lang = 1&cs-lang = csharp#code-snippet)を使用することができます。 -1)を選択します。 – Fabio

+0

ありがとうございます。期待しているようだ。 .NET 3.5の解決策は何ですか? – Edwin

+1

.NET 4.6に移動:) – Fabio

答えて

0

より多くの研究の後、私は私見the most useful threading reference sourceで、ケース(B)のためのソリューションを自分自身を見つけた:

待って

パルスを使用する方法

はここで待ってパルスを使用する方法は次のとおりです。

readonly object _locker = new object(); 

デフ:

など、同期オブジェクトとして使用するための単一のフィールドの定義あなたのカスタムブロッキング条件で使用するためのineフィールド。あなたがブロックするたび

bool _go; or: int _semaphoreCount; 

は、次のコードを含める:たとえば

lock (_locker) 
{ 
    // Alter field(s) or data that might impact blocking condition(s) 
    // ... 
    Monitor.Pulse(_locker); // or: Monitor.PulseAll (_locker); 
}