我完全難住在這裏。我有一大塊依賴互斥鎖的代碼來保護它。當我在我的開發機器上運行這段代碼時,我的測試機器運行良好。但是當我把它推到生產機器上時,它就會失敗。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
出現互斥立即被鎖定在門外。我的印象是互斥體只在線程之間共享,並在進程退出時被銷燬,所以共享相同互斥體的兩個獨立進程應該是好的,對嗎?另外,如果應用程序在互斥體釋放之前崩潰,是否會導致此行爲?
編輯:我差點忘了。之前我的應用程序曾經崩潰,我不得不強制退出它。
「以前我的應用程序隨機崩潰,我不得不強制退出它。」 - 哇,你沒有被打擾? ... – 2013-02-18 00:54:54