3

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

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

aManualResetEvent.WaitOne( 0 );

返回一个布尔值而不等待事件。

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

此时我可以确定的最佳选择是在实际测试事件时将其更改AutoResetEvent为 aManualResetEvent并手动重置:

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

有没有更好的方法来检查 a 的状态AutoResetEvent?如果可能的话,我更喜欢它的内在原子性AutoResetEvent

4

1 回答 1

0

关键AutoResetEvent是在事件转换到信号状态时释放一个且只有一个等待线程。如果您使用信号状态在一个线程中执行特定操作,如果另一个线程仍然可以等待事件的信号,您可能会陷入竞争条件或线程之间的死锁——这是使用AutoResetEvent.

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

于 2012-09-05T18:56:29.517 回答