簡體   English   中英

我應該處理Mutex嗎?

[英]Should I dispose a Mutex?

我正在開發2個Windows服務,它有一個公共數據庫,我想用系統Mutex鎖定(交叉處理)。

現在我想知道在try-finally塊中調用WaitOne()ReleaseMutex() ,或者我是否也應該using Mutex(例如在using塊中)。 如果是這樣我想我應該總是在WaitOne()方法上捕獲AbandonedMutexException ,或者我在這里錯了?

互斥鎖是Windows內核對象(此處包含在.NET對象中)。

因此,它應該是一種非托管資源。

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

我不相信Mutex類docs中沒有處理互斥對象的代碼示例 雖然Henzi在評論中有一個很好的觀點:Mutex對象是靜態的,並且在進程退出時由終結器處理或由Windows內核銷毀。

另請注意, Close()也會處理對象。

當然,即使您不使用它,在應用程序中保留現有Mutex對象也沒有錯。 它們是輕資源。

根據這個名稱,當持有該互斥鎖的HANDLE的最后一個進程結束時,一個命名的Mutex會自動銷毀。

MSDN表示,在非托管條款中

使用CloseHandle函數關閉句柄。 當進程終止時,系統會自動關閉句柄。 當最后一個句柄關閉時,互斥對象將被銷毀。

在.NET中,您應該在Mutex上調用.Close() - 這會釋放HANDLE ...因為每個進程在訪問同一個名為Mutex時都會獲得自己的HANDLE這是一致的做法...不會調用Close()一旦流程不復存在,就會留下任何問題(終結者和所有人)......

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

從文檔:

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

waithandle使用非托管資源,應在使用結束時進行處理。

MSDN文檔Mutex

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM