您可以使用 Mutex 物件來提供資源的獨佔存取權。 類別 Mutex 會使用比 Monitor 類別更多的系統資源,但它可以跨應用程式域界限進行封送處理,它可以與多個等候搭配使用,而且可用來同步處理不同進程中的線程。 如需比較管理式同步機制,請參閱 同步原語概覽。
如需程式代碼範例,請參閱建構函式的 Mutex 參考檔。
使用 Mutex
線程會呼叫 WaitOne Mutex 的 方法來要求擁有權。 呼叫會封鎖,直到 Mutex 可用,或直到選擇性逾時間隔經過為止。 如果沒有任何線程擁有 Mutex,則會發出 mutex 的狀態。
線程會藉由呼叫其 ReleaseMutex 方法釋放 Mutex。 Mutex 具有線程親和性;也就是說,Mutex 只能由擁有它的線程釋放。 如果線程釋放了它不擁有的 Mutex,則會在該線程中拋出 ApplicationException。
因為類別 Mutex 衍生自 WaitHandle,您也可以呼叫 WaitAll 的靜態 WaitAny 或 WaitHandle 方法,來請求 Mutex 的擁有權,並與其他等待控制項結合使用。
如果線程擁有 Mutex,該線程可以在重複的等候要求呼叫中指定相同的 Mutex 而不會阻礙其執行,不過,它必須釋放 Mutex 若干次以釋放擁有權。
已放棄的 Mutex
如果線程在未釋放Mutex時終止,則表示該互斥鎖被遺棄。 這通常表示嚴重的程式設計錯誤,因為 Mutex 正在保護的資源可能處於不一致的狀態。 AbandonedMutexException在下一個取得 mutex 的線程中擲回 。
在全系統 Mutex 的情況下,已放棄的 Mutex 可能表示應用程式已突然終止(例如,使用 Windows 任務管理器)。
本機和系統 Mutex
Mutex 有兩種類型:本地互斥鎖和具名系統互斥鎖。 如果您使用接受名稱的建構函式建立 Mutex 物件,它會與該名稱的作系統對象相關聯。 具名系統 Mutex 可在整個作系統中看到,而且可用來同步處理程式的活動。 您可以建立多個 Mutex 代表相同具名系統 Mutex 的物件,而且您可以使用 OpenExisting 方法來開啟現有的具名系統 Mutex。
本地互斥鎖只存在於您的程序內。 它可以由進程中具有本地 Mutex 對象引用的任何線程使用。 每個 Mutex 物件都是個別的本機 Mutex。
系統 Mutex 的存取控制安全性
.NET Framework 可讓您查詢和設定具名系統物件的 Windows 訪問控制安全性。 建議從創建之時就保護系統 Mutex,因為系統對象是全域的,因此可以被其他程式代碼鎖定。
如需了解 Mutex 存取控制安全性的相關資訊,請參閱 MutexSecurity 和 MutexAccessRule 類別、MutexRights 列舉、GetAccessControl 類別的 SetAccessControl 和 OpenExisting 方法,以及 Mutex 類別的 Mutex(Boolean, String, Boolean, MutexSecurity) 建構函式。
備註
系統 Mutex 的存取控制安全性僅適用於 .NET Framework,不適用於 .NET Core 或 .NET 5+。