プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

.NET FrameworkのMutexではまったこと

たった今バグを見つけたので忘れずに書いておきます。

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()

f:id:puni-o:20160405190017p:plain

こうなります。

オブジェクト同期メソッドは、コードの非同期ブロックから呼び出されました。

この追加情報に騙されてしまいましたが、何のことはないシグナル受信していないのに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。

この例外今回が初めてじゃない気がする・・・