我编写了这段代码作为概念的证明,以检查我正在试验的当前项目中的一个问题。
var sleeper = new AutoResetEvent(false);
sleeper.Set();
sleeper.Set();
sleeper.Set();
var ix = 0;
while(true) {
sleeper.WaitOne();
Console.Write(ix++);
}令人惊讶的是(至少对我来说)我没有得到我期望的结果。我希望在控制台中打印一个012,但只打印0。
发布于 2018-07-31 14:15:08
0- create AutoResetEvent (state = 0)
- signal AutoResetEvent (state = 1)
- signal AutoResetEvent (state = 1)
- signal AutoResetEvent (state = 1)
- start waiting on the event (process the current signalled state of 1 and switch it to 0)
- go on waiting on the event
如msdn AutoResetEvent 描述中所述
此外,如果在没有线程等待且AutoResetEvent已经发出信号时调用Set,则调用没有任何效果。
像这样的东西应该对你有用
private static AutoResetEvent sleeper;
static void Main()
{
sleeper = new AutoResetEvent(false);
Thread t = new Thread(ThreadProc);
t.Start();
var ix = 0;
while(true)
{
sleeper.WaitOne();
Console.Write(ix++);
}
}
static void ThreadProc()
{
Thread.Sleep(1000);
sleeper.Set();
Thread.Sleep(1000);
sleeper.Set();
Thread.Sleep(1000);
sleeper.Set();
}正如它的“描述”中提到的,因此出现了Thread.Sleep(1000)位。
不能保证每次调用Set方法都会释放一个线程。如果两个调用太近,以致第二个调用发生在线程被释放之前,则只释放一个线程。就好像第二个电话没有发生一样。
https://stackoverflow.com/questions/51614731
复制相似问题