我在想,
为什么我想要在true
的ctor中传递AutoResetEvent
?
我创建了一个waitHandle
,以便任何致电WaitOne()
的人实际上等待。
如果我使用true
进行实例化,那就好像是立即发出信号 - 这就像没有等待的正常流程一样。
EventWaitHandle _waitHandle = new AutoResetEvent (false);
void Main()
{
new Thread (Waiter).Start();
Thread.Sleep (1000);
_waitHandle.Set();
Console.ReadLine();
}
void Waiter()
{
Console.WriteLine ("AAA");
_waitHandle.WaitOne();
Console.WriteLine ("BBBB");
}
输出:
AAA...(delay)...BBB
更改为:EventWaitHandle _waitHandle = new AutoResetEvent (true);
,输出将为:
AAABBB
问题:
true
)? 答案 0 :(得分:10)
方案是调用WaitOne
的第一个线程应该立即通过,而不会阻塞。
检查Silverlight documentation for AutoResetEvent(奇怪的是,.Net版本的文档不一样):
为
true
指定initialState
会在AutoResetEvent
中创建AutoResetEvent
信号状态。如果你想要第一个线程,这很有用 等待{{1}}立即释放,没有 堵“。
答案 1 :(得分:7)
这里有一个很好的解释:Signaling with Event Wait Handles。
换句话说,等待句柄就像一个旋转门,WaitOne
的来电者就像一排排在十字转门的人。每次调用Set
时,旋转门允许一个人通过(通常按照他们排队的顺序,但有时不会,因为操作系统怪癖)。
如果构造为'true',则旋转栅门已经打开,但只有一个人,因此WaitOne
的第一个调用者将立即“通过”,但任何后续调用者都将仍然要排队。
显然,如果你只有一个WaitOne
的来电者,那么这一切都不适用,所以“真实”选项没有实际意义。
答案 2 :(得分:1)
不确定。
一个要求 - 线程X必须在应用程序启动时运行,之后每10秒运行一次。一个定时的WaitForSingleObject(myARE,10000)可以完成这项工作。将ARE初始化为'true'将确保线程在启动时运行。
编辑:
myARE.WaitOne(10000);
抱歉 - 我暂时退出了C#模式进入WINAPI :(