VS 2012、.Net 4.5 を使用しています。
このコードを実行します (スレッドに関する記事からいくつかのサンプルをアップグレードするだけです)。
using System.Threading;
class BasicWaitHandle
{
static EventWaitHandle wh = new AutoResetEvent(false);
static void Main()
{
new Thread(Waiter).Start();
new Thread(Waiter).Start();
Thread.Sleep(1000); // Подождать некоторое время...
wh.Set(); // OK – можно разбудить
wh.Set();
Console.ReadLine();
}
static void Waiter()
{
Console.WriteLine("Avait..."+Thread.CurrentThread.ManagedThreadId);
wh.WaitOne(); // Ожидать сигнала
Console.WriteLine("Got a signal"+Thread.CurrentThread.ManagedThreadId);
}
}
私はそれを数回デバッグしますが、通常 (常にではありません) 間違った結果が得られます。最初に(1回以上)修正します:
Avait...10
Avait...11
Got a signal 11
Got a signal 10
しかし、その後、1 つのスレッドをスキップし始めます (最初の場合もあれば、2 番目の場合もあります)。
Avait...10
Avait...11
Got a signal 11 (or 10)
そして、プログラムは反応しません。数分で正しい結果が得られますが、再び間違った結果が得られます...
さらに、段階的にデバッグすると、常に正しく動作します。
だから、多分私は別のアプローチを選ぶべきですか?しかし、スレッドがランダムな順序でシグナルを受け取ったとしても、これは私が期待したように見えます...