2011-10-19 139 views
12

我試圖用一個互斥量,以保護訪問從多個線程一些硬件,但我很困惑,什麼exitContext參數意味着/做:WaitHandle.WaitOne的含義是什麼意思?

public virtual bool WaitOne (
    int millisecondsTimeout, 
    bool exitContext 
) 

The docs說:

exitContext - true在等待之前(如果在同步上下文中)退出上下文的同步域,並在之後重新獲取它;否則,虛假

......不過這是什麼實際上意味着,什麼是它設置爲true或false的後果是什麼?我現在已經將它設置爲true,並且代碼似乎可以工作,但是我很緊張,我不完全瞭解它的內幕。

回答

5

這也解釋了further down the page under Remarks說:

注意事項退出上下文

的exitContext參數沒有影響,除非該方法的WaitOne是 從非默認託管上下文中調用。如果 您的線程位於對來自 ContextBoundObject的類實例的調用中,則可能發生這種情況。即使您當前在 類中執行的方法不是從ContextBoundObject派生的,例如String,但如果ContextBoundObject位於當前應用程序域中的 堆棧上,則您的 可能處於非默認情況下。

當你的代碼是在非默認上下文中執行,對exitContext指定真正 導致線程 執行的WaitOne方法之前退出該非默認管理 上下文(即,過渡到默認的情況下)。在對WaitOne方法的調用完成後,該線程返回到原始的 非默認上下文。

當上下文綁定的類具有 SynchronizationAttribute時,這會很有用。在這種情況下,所有對 類成員的呼叫都會自動同步,並且同步域 是該類的全部代碼。如果調用堆棧 中的代碼成員調用WaitOne方法併爲exitContext, 指定true,則線程將退出同步域,從而允許在調用對象的任何成員時阻止線程 繼續。當WaitOne方法返回時,進行調用的線程必須等待到 重新進入同步域。

14

MSDN頁面的備註部分讀起來就像是完全的gobbledegook當然。執行上下文在.NET中是一個隱藏得很好的實現細節。我只是告訴你我扭轉了設計而不能完全鎖定它。

exitContext參數僅適用於遠程方案。通過傳遞true,您允許暫停當前呼叫,並將另一個呼叫從客戶端封送到服務器。你會這樣做以提高吞吐量,只有當你期待WaitOne()調用需要一段時間時才選擇true。這樣做的確切含義對我來說並不明顯,也沒有記錄在我所知的任何地方。 WaitOne()過載(無超時)總是通過false,這讓我的解釋很不幸。

這種方法背後的一個側面的故事是,它是如此知之甚少,微軟決定打破.NET 2.他們還說在Service Pack 2中的WaitOne(int)的過載這被當作是對exitContext假向後兼容性的說法。這造成了很大的混亂,程序員開始使用它,然後發現他們的程序在SP2之前版本的.NET上運行時失敗。哎喲。