這裏是我的代碼,以使一個方法調用相互exlcussive互斥C#安全手柄已經關閉
public class X
{
private static Mutex mutex = new Mutex(true, "MutexForFile");
public IList<string> DoIt(IList<string> documents)
{
var result = new List<string>();
if (mutex.WaitOne())
{
using (var agent = new MyClass())
{
// operation login
if (agent.LibraryLogon("**", "***"))
{
try
{
//codes to access shared resource
}
catch (Exception e)
{
Log.ErrorFormat("");
}
finally
{
if (!mutex.SafeWaitHandle.IsClosed)
{
mutex.ReleaseMutex();
}
mutex.Dispose();
}
Log.DebugFormat("Completed");
}
else
{
throw new Exception("Unable to Login Session");
}
}
Log.DebugFormat("Completed Do it");
}
return result;
}
}
我不得不做檢查如果(!mutex.SafeWaitHandle.IsClosed)作爲我的ObjectDisposedException當我調用mutex.ReleaseMutex()時說「安全句柄已關閉」。
這是避免這種異常的正確方法嗎?
有沒有曾經可以提出任何坑或這個代碼的問題?
我建議閱讀MSDN上的構造函數的Mutex類的文檔。具體來說''Mutex(bool initialOwned,string name)'''Mutex(bool initialOwned,string name,out bool creatNew)'最簡單的修復方法可能是用intiallyOwned = false初始化您的互斥鎖,而不是true。然後,您應該能夠在最終語句中刪除if塊。我沒有證實這一點,並且自從使用.Net互斥體已經很長時間了,但是,我認爲這將解決問題。根據你完全使用互斥鎖,你可能需要做更多的處理。 – RLH 2014-10-20 14:45:35
文檔爲方便:http://msdn.microsoft.com/en-us/library/System.Threading.Mutex(v=vs.110).aspx – RLH 2014-10-20 14:45:54
我曾試過這個,但那並沒有幫助我 – 2014-10-20 14:47:59