我正在.NET(C#)的多线程服务器中创建一些“仪器”。

检查.NET ManualResetEvent的值非常容易,无需担心更改值:

aManualResetEvent.WaitOne( 0 );

返回 bool 值,而无需等待事件。

但是,我似乎无所适从AutoResetEvent获得相同的信息;如果您在anAutoResetEvent.WaitOne( 0 )事件上调用set,它将在返回时重置该事件(根据定义)。

在这一点上,我可以确定的最佳选择是将AutoResetEvent更改为ManualResetEvent并在实际测试事件时手动重置:
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的固有原子性。

最佳答案

AutoResetEvent的要点是,当事件转换为信号状态时,释放一个且仅一个等待线程。如果使用信号状态在一个线程中执行特定操作,则如果另一个线程仍可以等待事件的信号,则可能会陷入竞争状态或线程之间出现死锁,这是使用AutoResetEvent的原因之一。

如果您提供有关您要完成的工作的更多详细信息,也许有人可以提供可以帮助您的替代方法。

关于.net - 在不影响事件的情况下检查AutoResetEvent的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9459798/

10-12 15:26