我正在使用2個Windows服務,這些服務具有一個公用數據庫,我想用系統互斥鎖來鎖定(跨進程)。我應該處置一個Mutex嗎?
現在,我不知道是否它的確定只是調用WaitOne()
和ReleaseMutex()
在try-finally
塊或者我應該也配置互斥(例如在using
塊)。如果是這樣,我想我應該總是趕上WaitOne()
方法AbandonedMutexException
或我錯了嗎?
我正在使用2個Windows服務,這些服務具有一個公用數據庫,我想用系統互斥鎖來鎖定(跨進程)。我應該處置一個Mutex嗎?
現在,我不知道是否它的確定只是調用WaitOne()
和ReleaseMutex()
在try-finally
塊或者我應該也配置互斥(例如在using
塊)。如果是這樣,我想我應該總是趕上WaitOne()
方法AbandonedMutexException
或我錯了嗎?
互斥體是Windows內核對象(這裏,裹在.NET對象)。
因此,這是一個非託管資源,應予以處置。
更準確地說,.NET對象包含對互斥鎖的HANDLE,它必須以某種方式釋放/處置。
我不相信code sample in the Mutex class docs其中互斥對象不處理。雖然Henzi在評論中有一個很好的觀點:Mutex對象是靜態的,當進程退出時,它會被終結器處理或被Windows內核銷燬。
另外,請注意Close()也配置了該對象。
當然,即使不使用它,在應用程序中保留現有的Mutex對象也沒什麼問題。他們是輕資源。
還沒有代碼示例,你必須鏈接它:http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx –
完成。下一次,隨時編輯我的答案;-) –
但是,因爲我創建Windows服務,我想我不應該在我的服務(總是)的「運行時」期間處置。每次創建一個具有相同名稱的新Mutex實例會將相同的非託管實例包裝在一起?還是會反覆創建新的非託管資源?我可以關閉互斥鎖,當我的一個服務停止真正清理它可能嗎? – Koen
您需要處理waithandle使用的資源。
從文檔:
釋放由WaitHandle的 類的當前實例使用的所有資源。 (繼承WaitHandle。)
等待句柄使用非託管資源,應在使用結束時使用非託管資源。
您需要AbandonedMutexException來告訴您擁有該互斥鎖的服務已意外終止。在這種情況下,您*有*停止使用數據庫並等待其他服務重新啓動。使用第三個流程來充當仲裁者將是明智的。 –