私はここで完全に困惑しています。ミューテックスに依存して保護するコードのチャンクがあります。このコードのチャンクを開発マシンとテスト マシンで実行すると、問題なく動作します。しかし、それを本番マシンにプッシュすると失敗します。
しかし、これがキッカーです。以前は機能していましたが、この特定のブロックにコードを変更しませんでした。しかし、もっと待ってください!文字通りまったく同じコード ブロックを使用する 2 番目のプロセスがあり、問題なく動作します。
ミューテックスは次のように宣言されます。
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
ミューテックスは、ゲートから出た直後にロックされているようです。ミューテックスはスレッド間でのみ共有され、プロセスが終了すると破棄されるので、同じミューテックスを共有する 2 つの別個のプロセスは適切であるという印象を受けています。また、ミューテックスが解放される前にアプリケーションがクラッシュした場合、この動作が発生する可能性はありますか?
編集:私はほとんど忘れていました。ランダムに以前に、アプリケーションが激しくクラッシュし、強制終了する必要がありました。