C#中的新AutoResetEvent(true)用法?
我在想 为什么我要在C#中的新AutoResetEvent(true)用法?,c#,.net,multithreading,autoresetevent,C#,.net,Multithreading,Autoresetevent,我在想 为什么我要在AutoResetEvent的ctor中传递true 我创建了一个waitHandle,这样任何调用WaitOne()的人实际上都会等待 如果我用一个true来实例它,就好像它是立即发出信号的——这就像没有等待的正常流程一样 EventWaitHandle _waitHandle = new AutoResetEvent (false); void Main() { new Thread (Waiter).Start(); Thread.Sleep (100
AutoResetEvent
的ctor中传递true
我创建了一个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\u waitHandle=new AutoResetEvent(true)代码>和输出将为:
AAABBB
问题:
- 我为什么要这么做?(通过
true
)李>
场景是调用
WaitOne
的第一个线程应该立即通过,而不会阻塞
检查(奇怪的是,文档在.Net版本上不一样):
为initialState
指定true
将在中创建一个AutoResetEvent
发出信号的状态。如果希望第一个线程
等待AutoResetEvent
立即释放,无需任何提示
阻挡。”
这里有一个很好的解释:
换言之,等待手柄就像一个旋转栅门,WaitOne
的呼叫者就像一排人在旋转栅门前排队。每次调用Set
,旋转栅门都允许一个人通过(通常按照他们排队的顺序,但有时由于操作系统的特殊性而不允许)
如果它是用“true”构造的,则旋转栅门已经打开,但只对一个人开放,因此WaitOne
的第一个呼叫者将立即“通过”,但任何后续呼叫者仍必须排队
显然,如果您只有一个调用方WaitOne
,那么这一切都不适用,因此“true”选项将毫无意义。当然
一个要求-线程X必须在应用程序启动时运行,此后每隔10秒运行一次。定时WaitForSingleObject(myARE,10000)将完成此任务。将ARE初始化为“true”将确保线程在启动时运行
编辑:
抱歉-我从C#模式退出到WINAPI中,简单地说:(谢谢@jeroenh-我试图自己添加代码块,但我的ISP今天又出现了问题,DNS上下断断续续:(单词“release”非常混乱。看起来你在释放线程CPU时间片,但实际上你让它在.WaitOne()之后继续工作)
call。你说得对,这让人困惑。我在文档页面上添加了一条评论。
myARE.WaitOne(10000);