私はスレッドセーフではない固定の数の "ブラウザ"を持っていますので、スレッドごとに使用する必要があります。一方、私はこれらのブラウザを使用するのを待っているスレッドの長いリストを持っています。だから私は私がのために特定のブラウザのインデックスを取得することができ、ブラウザごとに1 AutoResetEvent
を、持っているWaitHandle.WaitAnyスレッドが順序通りに入力できるようにします
WaitHandles = Enumerable.Range(0, Browsers.Count).Select(_ => new AutoResetEvent(true)).ToArray();
:
public readonly AutoResetEvent[] WaitHandles;
そして、このようにそれらを初期化します。私は現在やっていることはAutoResetEvent
配列を持っています各スレッド:
public Context WaitForBrowser(int i)
{
System.Diagnostics.Debug.WriteLine($">>> WILL WAIT: {i}");
var index = WaitHandle.WaitAny(WaitHandles);
System.Diagnostics.Debug.WriteLine($">>> ENTERED: {i}");
return new Context(Browsers[index], WaitHandles[index]);
}
これらのスレッドがリストにあるとパルティを持っているので、ここでi
は、スレッド待ちの単なる指標であり、尿道序列私はデバッグの目的でこれを渡しています。 Context
は、処分されるときに待機ハンドル上のSet
を呼び出す使い捨て品です。
WaitForBrowser
への呼び出しが順番に行われているので、すべての「>>> WILL WAIT:{i}」メッセージが正しい順序で表示されますが、私の出力を見ると、「>>> ENTERED: i}」のメッセージはランダムな順番(最初の数を除く)であるため、var index = WaitHandle.WaitAny(WaitHandler);
行に到着したのと同じ順序で入力していません。
私の質問は、WaitForBrowser
メソッドが呼び出された(「>>> ENTERED:{i}」というメッセージも同様に)注文されるようにこれを変更する方法はありますか?
[?C#でFIFOの順序を保証する同期クラスがあります]の可能な重複(https://stackoverflow.com/questions/961869/is-there-a-synchronization-class-that-保証 - fifo-order-in-c) –
@JohnWu同じ質問ではない(質問の本文を参照) – Juan