2014-10-20 55 views
-1

這裏是我的代碼,以使一個方法調用相互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()時說「安全句柄已關閉」。

這是避免這種異常的正確方法嗎?

有沒有曾經可以提出任何坑或這個代碼的問題?

+0

我建議閱讀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

+0

文檔爲方便:http://msdn.microsoft.com/en-us/library/System.Threading.Mutex(v=vs.110).aspx – RLH 2014-10-20 14:45:54

+0

我曾試過這個,但那並沒有幫助我 – 2014-10-20 14:47:59

回答

3

應避免處置互斥,而另一個線程正在等待它:

Thread #1: WaitOne() -> gets ownership 
Thread #2: WaitOne() -> waits for thread #1 
Thread #1: ReleaseMutex() -> causes thread #2 to continue 
Thread #1: Dispose() 
Thread #2: ReleaseMutex() -> mutex was disposed by thread #1 

SafeWaitHandle.IsClosed只是防止異常出現,但並沒有解決根本問題。它只能在產生這些線程的代碼中解決,而不能在線程中解決 - 也許你不應該有多個線程試圖同時登錄?

+0

我可以在http://msdn.microsoft.com/en-us/library/system.threading.mutex.releasemutex.aspx看到類似的東西 – 2014-10-21 12:06:11

+0

我不知道應該在哪裏調用ReleaseMutex和Dispose方法。可以顯示任何一個節目我呢? – 2014-10-21 12:35:43

+0

@KuttanSujith我不知道你爲什麼首先需要'Mutex'的原因 - 爲什麼你想讓多個線程執行這個操作? – 2014-10-21 13:04:02