我正在.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/