2015-11-23 53 views
1

我有一個線程等待一個的EventWaitHandle(的AutoResetEvent):在.Set之後直接調用.Close(.Dispose)EventWaitHandle是否安全?

AutoResetEvent.WaitOne(); 

我有另一個線程信號的第一個線程繼續

AutoResetEvent.Set(); 
AutoResetEvent.Close(); 

它是安全的調用.SET後.Close直接,換句話說,可以保證在AutoResetEvent處理之前等待的線程已經繼續了嗎?

+0

[文檔爲'Close'](https://msdn.microsoft.com/en-us/library/system.threading.waithandle.close(v = vs.110).aspx)說:_「一旦調用了這個方法,對當前實例的引用就會導致未定義的行爲。「_無論是對它的新引用,還是現有的引用,例如對'WaitOne'的調用都不明確。但我不想嘗試它......爲什麼不把它從正在等待的人那裏關閉/處置掉? –

+0

因爲等待是可選的,所以如果等待沒有完成,它將不會被處置。 – Edwin

回答

1

是的,如果事情完全按照你的問題描述的那樣安全的話,這是安全的。如果知道所有線程在您調用set時已經在等待,那麼這些線程將會被髮送信號,並且一切正常,因爲所有正在等待的線程都會保證在調用set語句之前釋放。

但是,如果您由於某種原因而遇到競賽並致電設置並在之前關閉,則線程已開始等待,您將在嘗試等待時收到異常。所以在實踐中,你最好避免這種模式。恕我直言

+0

我認爲你永遠不會知道線程正在等待。在進入等待之前,他們可能會被取消預定1條指令,而其他線程無法分辨。 – usr

+0

感謝您的回覆。所以我放棄了這種模式。我發現一個AutoResetEvent的託管實現,我可能會嘗試使用該運行方式:http://www.codeproject.com/Articles/244638/Managed-Thread-Synchronization – Edwin

+0

@usr正是這樣,這就是爲什麼我認爲這是一個不好的模式依靠。我不太瞭解這裏推薦的其他解決方案,但可以在關閉句柄之前執行一些簡單的線程安全倒計時,其中線程信號和關閉句柄檢查計數,以確保所有使用者完成其任務。或者簡單地反轉依賴關係。 – Niclas

相關問題