ただの覚え書きなので読みやすさとか考えてないです

 

二重起動を防止したいときにMutexを使う。

場所はスタートアップメソッドがいいかと。

 

以下コード

 

using System;

using System.Threading;

 

public static class EntryPoint
{

    private static Mutex _Mutex;

      
    public static void Main()
    {
        try
        {
            if (!GetMutex())
            {
                MessageBox.Show("既に起動しています。");
                return;
            }

 

            //ここにその後の実行コード

 

        }
        finally
        {
            if(_Mutex != null)
                _Mutex.Close();
        }
     }

    private static bool GetMutex()
    {
        if (_Mutex != null)
            return true;

 

        bool isCreated = false;
        try
        {

            //MutexName: Mutexの特定に使う固有名。被らなければ何でもOK

            _Mutex = new Mutex(true, "MutexName", out isCreated);
        }

        //異常終了して解放されなかったときに例外が吐かれていても

        //確保できているので整合性とかの問題がないならtrueでOK。

        catch (AbandonedMutexException)
        {
            isCreated = true;
        }
        return isCreated;
    }
}

 

 

new Mutexをするときに、3引数のものを使うと、同時にMutexを取れたかどうかを最後のoutで指定した変数に入れてくれるので、これを使うと便利。

 

注意点として、たまにReleaseMutexしてからCloseするソースを見かけるが、二重起動を防止する、という意味ではReleaseMutexする意味がない(解放する=アプリ終了)なので、Closeだけで大丈夫(解放もやってくれるから)。むしろ、ReleaseMutexを入れてしまうと、例外を吐いてくる場合があるので、しないほうがいい。

 

参考:MSDN Mutexクラス(System.Threading)  

https://msdn.microsoft.com/ja-jp/library/system.threading.mutex(v=vs.110).aspx