いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

多重起動の禁止(System.Threading.Mutex)

アプリケーションを開発していて、多重起動を禁止するのはよくあることです。
.NETでは、簡単に禁止処理を行うことができます。


使用するクラスは、

System.Threading.Mutex

です。


Moniterがプロセス内での排他制御を行えるのに対して
Mutexの方は、プロセスをまたがって排他制御ができます。


以下のメソッドを使用します。

new Mutex(bool, string)
Mutex.WaitOne(TimeSpan, bool)
Mutex.ReleaseMutex()


以下、サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;

namespace Gsf.Samples.WinForms{

    /// 
    /// System.Threading.Mutexのサンプルです。
    /// 
    /// 
    /// Mutexクラスを用いて、多重起動を禁止します。
    /// 
    public class MutexSample : Form{

        public MutexSample(){
            InitializeComponent();
        }

        protected void InitializeComponent(){
            Text = typeof(MutexSample).FullName;
            Size = new Size(400, 100);
        }

        static void Main(){
            //
            // Mutexを生成.
            //
            // 初期所有権は付与せず(第一引数)、名前はアプリ名と同じにする
            //
            Mutex m = new Mutex(false, typeof(MutexSample).FullName);

            //
            // 所有権を要求
            //
            if(!m.WaitOne(TimeSpan.Zero, false)){
                //
                // 所有権を取得できなかった場合は、既に同名のプロセスが起動しているとみなす
                //
                MessageBox.Show("多重起動はできません。");

                return;
            }

            Application.Run(new MutexSample());

            //
            // 所有権をリリース
            //
            m.ReleaseMutex();
        }
    }
}


上記のコードをコンパイルして実行すると
一つ目のアプリケーションは起動しますが、2つ目を起動すると
既に同じ名前のMutexが獲得されているので起動せず、メッセージが表示されます。