2012-02-27 60 views
2

我在.NET(C#)中的多线程服务器内部创建了一些“工具”。在不影响事件的情况下检查AutoResetEvent的值

这是很容易检查.NET ManualResetEvent的值,而不关心改变值:

aManualResetEvent.WaitOne(0); 

返回一个布尔值,而无需等待的事件。

但是,我似乎无法从AutoResetEvent获取相同的信息;如果您在set事件上致电anAutoResetEvent.WaitOne(0),它将在返回(按定义)时重置事件。

我可以在这一点上确定最佳方案是改变AutoResetEventManualResetEvent当实际测试的情况下手动复位:

ManualResetEvent theEventFormerlyKnownAsAutoResetEvent; 
... 


// Using the event: 
if (theEventFormerlyKnownAsAutoResetEvent.WaitOne(timeout) 
{ 
    theEventFormerlyKnownAsAutoResetEvent.Reset(); 
    ... 
} 
... 

// Instrumentation to get event state (shouldn't change anything): 
bool eventIsSet = theEventFormerlyKnownAsAutoResetEvent.WaitOne(0); 
// Update instrumentation 

是否有检查的AutoResetEvent状态的更好的办法?如果可能的话,我更喜欢AutoResetEvent的内在原子性。

+0

这将是无用的,因为其他人可能会在您检查后清除该事件。 – SLaks 2012-02-27 03:50:55

+0

有了这个推理,视力是无用的,因为你看到的东西可能不再存在。 – 2012-02-27 03:53:52

+0

是的,但这里的重点是原子性。 – SLaks 2012-02-27 03:55:46

回答

0

AutoResetEvent的意义在于当事件转换到信号状态时释放一个且仅有的一个等待线程。如果您使用信号状态在某个线程中执行特定的操作,那么如果另一个线程仍然可以等待事件的信号,则可能会陷入竞争状态或线程之间的死锁 - 这是使用AutoResetEvent的原因之一。

如果您提供了更多关于您想要完成的细节的信息,也许有人可以提供一个可以提供帮助的替代方案。

+0

只是试图建立仪器上的事件状态;我想知道AutoResetEvent的状态而不触发它 - 也就是说,由于偷看数据(除了更改不相关的显示设置),不能采取任何行动。 – 2012-09-05 19:51:24

+0

这不是被支持的东西 - 下面的Win32 API没有任何东西可以获取这些信息。在通话结束后,你必须在代码的某个地方设置一个标志'Wait'... – 2012-09-05 20:26:49

+0

我怀疑同样多;此外,在错误的手中(包括我的),这将是危险的...... – 2012-09-05 21:10:57

相关问题