我正在使用 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);
}
}
我调试了几次,但通常(并非总是)得到错误的结果。起初(一次或多次)它是正确的:
Avait...10
Avait...11
Got a signal 11
Got a signal 10
但随后它只是开始跳过一个线程(首先是某个线程?第二个是某个线程):
Avait...10
Avait...11
Got a signal 11 (or 10)
而程序只是没有反应。几分钟后它给出了一些正确的结果,但又出错了......
此外,当我逐步调试它时,它总是正确运行。
那么,也许我应该选择另一种方法?但这看起来像我预期的那样,即使线程以随机顺序收到信号......