【C#】アプリを多重起動しないようにする

Mutex を取得して新規に作成できれば新規の起動、取れなかったら 2つめの起動という感じに判断できます。

string key = "application_name";
using (var mutex = new Mutex(true, key, out bool createdNew))
{
    if (!createdNew)
    {
        return; // 多重起動になる
    }
    else
    {
        // 多重起動ではない → ここにメインの処理を記述する
        mutex.ReleaseMutex();
    }
}

定型的な処理なので Utility 化したいと思います。

// MultiStartupUtil.cs

using System;
using System.Threading;

public static class MultiStartupUtil
{
    public static void SingleStartupContext(string key, Action action)
    {
        using (var mutex = new Mutex(true, key, out bool createdNew))
        {
            if (!createdNew)
            {
                return;
            }
            action?.Invoke();
            mutex.ReleaseMutex();
        }
    }
}

使い方は以下の通りです。

// Program.cs

using System;
using System.Windows.Forms;

internal static class Program
{
    [STAThread]
    static void Main()
    {
        // 多重起動防止用のメソッドにキーとメイン処理を渡す
        MultiStartupUtil.SingleStartupContext("application_name", _Main);
    }

    // メイン処理をこっちに引っ越す
    private static void _Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        using (FormTaskTray formTaskTray = new FormTaskTray())
        {
            Application.Run();
        }
    }
}