2010-07-22 110 views
32

我有一个WaitHandle,我想知道如何检查WaitHandle是否已经设置。如何检查WaitHandle是否已设置?

注意:我可以添加一个bool变量,并且无论何时使用Set()方法将该变量设置为true,但此行为必须在WaitHandle的某个位置构建。

感谢您的帮助!

+0

我的回答是之前SwDevMan唯一秒,这是更清晰,包括文档报价,所以我删除它。但是,我仍然想知道:“您是否正在处理可能已被重置的自动重置事件,或者测试代码是否不能重置?” – 2010-07-24 18:19:58

回答

47

WaitHandle.WaitOne(0)尝试

如果millisecondsTimeout是零,该方法不会阻塞。它测试等待句柄的状态并立即返回。

+1

*惭愧*谢谢! – 2010-07-22 20:30:35

+0

+1好的清楚答案。虽然我会建议将“尝试”更改为“使用”,但不错。就目前而言,你似乎不确定你的答案。 – 2010-07-22 20:31:46

+3

唯一的问题是,对于一些WaitHandles(自动重置事件,信号量),就绪状态实际上将通过等待来重置。 – 2010-07-24 18:21:26

2

使用上WaitHandleWait...方法,需要一个超时值,如WaitOne一个,并通过为0

1

超时可以使用WaitOne(int millisecondsTimeout, bool exitContext)方法和在0通为时间跨度。它会立即返回。

bool isSet = yourWaitHandle.WaitOne(0, true); 
+0

他们为什么要使用带'exitContext'值的引用?考虑到有些方法不需要这个领域,你应该解释它的必要性。 – 2010-07-22 20:34:30

+0

VS2005的在线帮助只显示WaitOne(),WaitOne(int,bool)和WaitOne(TimeSpan,bool)。所以,很可能他们没有找到WaitOne(int) – 2011-11-15 16:09:57

5
const int DoNotWait = 0; 

ManualResetEvent waitHandle = new ManualResetEvent(false);     

Console.WriteLine("Is set:{0}", waitHandle.WaitOne(DoNotWait)); 

waitHandle.Set(); 

Console.WriteLine("Is set:{0}", waitHandle.WaitOne(DoNotWait)); 

输出:

是集:假

是集:真

+0

为什么要为变量使用关键字?这是不必要的,让你的回答更难阅读。 – 2010-07-22 20:31:07

+0

@Jeff当然,这只是一个很难的事情了一些示例代码来命名,今天我已经写了很多代码。 – 2010-07-22 20:33:32

+0

@chibacity:写事件比事件更容易。 'waitHandle','resetEvent','mre','myEvent'。名单是无止境的,它会让你的例子更好。 – 2010-07-22 20:35:46