2013-02-12 42 views
1

我完全難住在這裏。我有一大塊依賴互斥鎖的代碼來保護它。當我在我的開發機器上運行這段代碼時,我的測試機器運行良好。但是當我把它推到生產機器上時,它就會失敗。Mutex.waitOne總是在特定機器上返回False

但是,這裏是踢球者,它曾經工作,我沒有做任何代碼更改到這個特定的塊。 但等一下還有更多!我有第二個過程使用字面上完全相同的代碼塊,它工作得很好!

互斥被聲明爲這樣:使用

Mutex _mutex = new Mutex(false, "SendTextMessage_11A52B63-4FC6-46DF-B72C-C45B225D4143"); 

的代碼塊是這樣的:

 public override void ForwardTextMessagesToDevice() 
    { 
     Trace.WriteLine("Here1"); 
     if (!_mutex.WaitOne(30000)) 
     { 
      Trace.WriteLine("Here2"); 
      Trace.WriteLine(String.Format("return mutex ForwardTextMessage: {0} {1}", this.Name, DateTime.Now)); 
      return; 
     } 
     try 
     { 
      Trace.WriteLine("Here3"); 
      ScheduledReports(); 
     } 
     finally 
     { 
      Trace.WriteLine("Here4"); 
      _mutex.ReleaseMutex(); 
     } 

跟蹤輸出是這樣的:

Here1 
Here2 
return mutex ForwardTextMessage: Method 2/11/2013 3:59:06 PM 
Here1 
Here2 
return mutex ForwardTextMessage: Method 2/11/2013 4:00:06 PM 

出現互斥立即被鎖定在門外。我的印象是互斥體只在線程之間共享,並在進程退出時被銷燬,所以共享相同互斥體的兩個獨立進程應該是好的,對嗎?另外,如果應用程序在互斥體釋放之前崩潰,是否會導致此行爲?

編輯:我差點忘了。之前我的應用程序曾經崩潰,我不得不強制退出它。

+0

「以前我的應用程序隨機崩潰,我不得不強制退出它。」 - 哇,你沒有被打擾? ... – 2013-02-18 00:54:54

回答

2

互斥鎖似乎立即鎖定在門外。我的印象是互斥體只在線程之間共享,並在進程退出時被銷燬,所以共享相同互斥體的兩個獨立進程應該是好的,對嗎?

命名爲互斥實例在所有進程之間共享。另一個進程可以鎖定互斥鎖。

Mutex constructor you are using的文檔:

互斥是兩種類型:本地互斥和命名的系統互斥。如果使用接受名稱的構造函數創建Mutex對象,則該對象與該名稱的操作系統對象關聯。命名系統互斥在整個操作系統中都是可見的,並且可以用來同步進程的活動。

至於你的第二個問題:

此外,如果應用程序的互斥體被釋放可能是導致此行爲之前崩潰?

這是由文檔涵蓋的Mutex

如果同時擁有一個互斥體線程終止,互斥體被認爲是放棄了。互斥狀態設置爲發信號,下一個等待線程獲得所有權。如果沒有人擁有該互斥量,則會發出互斥量的狀態信號。從.NET Framework 2.0版開始,在下一個獲取互斥鎖的線程中拋出AbandonedMutexException。在.NET Framework 2.0之前,不會引發異常。

在應用程序終止的情況下,互斥量應被標記爲廢棄。試圖獲得Mutex應提出AbandonedMutexException

+0

嗯,這是奇怪的。進一步調用線是一個應該寫入異常追蹤但不會發生的捕獲。即使進程瀏覽器也發生了0個異常。代碼絕對是在.net 3.5中編譯的。我嘗試追加1到互斥體的末尾,它現在可以工作。 – 2013-02-12 03:00:30