2012-02-27 119 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

相關問題