Проверьте значение AutoResetEvent, не влияя на событие - PullRequest
2 голосов
/ 27 февраля 2012

Я создаю некоторые «инструменты» внутри многопоточного сервера в .NET (C #).

Довольно просто проверить значение .NET ManualResetEvent, не беспокоясь о его изменении.:

aManualResetEvent.WaitOne( 0 );

возвращает логическое значение без ожидания события.

Однако я, похоже, затрудняюсь получить ту же информацию от 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, если это возможно.

1 Ответ

0 голосов
/ 05 сентября 2012

Смысл AutoResetEvent - освободить один и только один ожидающий поток, когда событие переходит в сигнальное состояние.Если вы использовали сигнальное состояние для выполнения чего-то определенного в одном потоке, вы рискуете попасть в состояние гонки или тупиковую ситуацию между потоками, если другой поток все еще может ожидать сигнал события - одна из причин использования AutoResetEvent.

Если вы предоставите более подробную информацию о том, что вы пытаетесь достичь, возможно, кто-то может предложить альтернативу, которая поможет.

...