2011-08-18 64 views
10

我正在使用2個Windows服務,這些服務具有一個公用數據庫,我想用系統互斥鎖來鎖定(跨進程)。我應該處置一個Mutex嗎?

現在,我不知道是否它的確定只是調用WaitOne()ReleaseMutex()try-finally塊或者我應該也配置互斥(例如在using塊)。如果是這樣,我想我應該總是趕上WaitOne()方法AbandonedMutexException或我錯了嗎?

+0

您需要AbandonedMutexException來告訴您擁有該互斥鎖的服務已意外終止。在這種情況下,您*有*停止使用數據庫並等待其他服務重新啓動。使用第三個流程來充當仲裁者將是明智的。 –

回答

12

互斥體是Windows內核對象(這裏,裹在.NET對象)。

因此,這是一個非託管資源,應予以處置。

更準確地說,.NET對象包含對互斥鎖的HANDLE,它必須以某種方式釋放/處置。

我不相信code sample in the Mutex class docs其中互斥對象不處理。雖然Henzi在評論中有一個很好的觀點:Mutex對象是靜態的,當進程退出時,它會被終結器處理或被Windows內核銷燬。

另外,請注意Close()也配置了該對象。

當然,即使不使用它,在應用程序中保留現有的Mutex對象也沒什麼問題。他們是輕資源。

+0

還沒有代碼示例,你必須鏈接它:http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx –

+1

完成。下一次,隨時編輯我的答案;-) –

+0

但是,因爲我創建Windows服務,我想我不應該在我的服務(總是)的「運行時」期間處置。每次創建一個具有相同名稱的新Mutex實例會將相同的非託管實例包裝在一起?還是會反覆創建新的非託管資源?我可以關閉互斥鎖,當我的一個服務停止真正清理它可能嗎? – Koen

2

您需要處理waithandle使用的資源。

從文檔:

釋放由WaitHandle的 類的當前實例使用的所有資源。 (繼承WaitHandle。)

等待句柄使用非託管資源,應在使用結束時使用非託管資源。

MSDN Documentation Mutex

6

根據this,當最後一個持有該互斥鎖的HANDLE的進程結束時,會自動銷燬一個名爲Mutex

在非管理方面MSDN說

使用CloseHandle功能關閉句柄。當進程終止時,系統自動關閉句柄。互斥對象在最後一個句柄關閉時被銷燬。

在.NET中,你應該呼籲Mutex.Close() - 這釋放了HANDLE ...因爲訪問甚至相同的命名Mutex這是一貫做法時......不叫Close()韓元」每個進程都有自己的HANDLE如果沒有更多(終結器和所有的)進程,則不會留下任何問題...

相關問題