たった今バグを見つけたので忘れずに書いておきます。
Mutex.WaitOne(timeout)
というかWaitHandle.WaitOne()かな?
private void Func(object o) { var mutex = new Mutex(false, "Mutex"); if (mutex.WaitOne(500)) { System.Diagnostics.Debug.WriteLine("True"); Thread.Sleep(1000000); } else { System.Diagnostics.Debug.WriteLine("False"); } mutex.ReleaseMutex(); mutex.Close(); }
非同期に呼ばれる関数のつもりです。
WaitOne()でシグナルを受信できたひとはそのまま眠り続けます。
WaitOne()でタイムアウトした人は関数を抜けます。
タイムアウトした人はmutex.RelaseMutex()
で
こうなります。
オブジェクト同期メソッドは、コードの非同期ブロックから呼び出されました。
この追加情報に騙されてしまいましたが、何のことはないシグナル受信していないのにReleaseMutex読んだのがいけないんです。
ということで
private void Func(object o) { var mutex = new Mutex(false, "Mutex"); if (mutex.WaitOne(500)) { System.Diagnostics.Debug.WriteLine("True"); Thread.Sleep(1000000); mutex.ReleaseMutex(); } else { System.Diagnostics.Debug.WriteLine("False"); } mutex.Close(); }
これでOK。
この例外今回が初めてじゃない気がする・・・