我使用VS 2012,.Net 4.5。有時會有EventWaitHandle!跳過線程
執行該代碼(剛剛從文章更新一些樣品約線程):
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);
}
}
我調試它幾次,但通常(並不總是)得到錯誤的結果。在第一(一次或多次)是否正確:
Avait...10
Avait...11
Got a signal 11
Got a signal 10
但隨後纔開始跳過一個線程(somethimes第一somethimes第二?):
Avait...10
Avait...11
Got a signal 11 (or 10)
和節目只是沒有反應。在幾分鐘內它會給出一些正確的結果,但然後再出錯...
此外,當我調試它一步一步它總是正確行事。
那麼,也許我應該選擇另一種方法?但是,這看起來像我所期待的,即使有線程以隨機順序信號...
很確定你是對的。我在wh.Set()之間添加Thread.Sleep(1000) - 調用和錯誤不重複。 ДочитаюАлбахари,тогдаподберуболееудачныйвариант。 – user3190541