根據MSDN文檔,無論操作是否成功,ManualResetEvent(或任何EventWaitHandle)上的Set()和Reset()都會返回一個布爾指示符。什麼時候可以ManualResetEvent.Set()返回false?
在哪種情況下,這個調用返回false,如果它發生了什麼,我該怎麼辦?
根據MSDN文檔,無論操作是否成功,ManualResetEvent(或任何EventWaitHandle)上的Set()和Reset()都會返回一個布爾指示符。什麼時候可以ManualResetEvent.Set()返回false?
在哪種情況下,這個調用返回false,如果它發生了什麼,我該怎麼辦?
我不確定如何回答這個問題,並查看了很多MSDN示例,Set返回值被忽略,因此它不一定很重要或可能發生。
但這並不夠好。我啓動了虛擬機,並打開了Reflector來查看代碼。 ManualResetEvent沒有Set,但它從EventWaitHandle繼承。下面的代碼:
public bool Set()
{
bool flag = Win32Native.SetEvent(base.safeWaitHandle);
if (!flag)
{
__Error.WinIOError();
}
return flag;
}
凡SetEvent的是從進口的Kernel32:
[DllImport("kernel32.dll", SetLastError=true)]
internal static extern bool SetEvent(SafeWaitHandle handle);
的WinIOError()調用只是調用GetLastWin32Error,我們並不真正關心。基本上這意味着調用返回false,在Win32本地代碼中必然會出現一些錯誤。
將這些信息與MSDN文檔中託管的代碼忽略返回值的事實(爲什麼不呢?如果內核無法正常運行,您會怎麼做?)如果您想清理乾淨,您可以自己忽略它你的邏輯上升了一點,或者如果你特別迂腐,就把它記錄下來並記錄下來。
我不確定只是記錄錯誤並繼續執行就足夠了。 Set()的錯誤結果可能會在由等待處理程序管理的線程同步中帶來錯誤的行爲。這是多線程......我處理假Set()結果的願景 - 拋出異常,這在大多數情況下可能是未處理的。
研究得很好的答案。 +1 – spender 2010-11-04 01:59:19
謝謝!這是一個有趣的問題,它讓我很好奇。 – 2010-11-04 02:09:16
謝謝埃裏克。受到你工作的啓發,我做了同樣的事情,並打開了反射器。它看起來像WinIOError()將總是會拋出一個異常,試圖在.NET世界中表示Win32錯誤代碼,這是有道理的 - 但仍然不能解釋爲什麼該調用具有返回值! – SoftMemes 2010-11-04 04:04:15