2021年4月23日金曜日

【C#】多重起動禁止の対応

最近仕事でC#を使用しているのですが、
久々に使うこともあり、忘れていることばかりです。
まあ、その都度調べていることが多いのですが、
せっかくなので、そういう内容を記事にして間を持たせていきたい。

今回は、C#アプリケーションの多重起動禁止について。




多重起動禁止のアプリケーションの必要性

ファイル書き込みとか、通信を行うアプリケーションの場合、
複数起動していて、複数のアプリケーションから同時にアクセスしたりすると
構造上不味い場合があります。

こういったときに、複数同時にアクセスが行われたときに大丈夫なように作るよりも、
そもそも、複数起動できないようにした方が、楽です。
(身も蓋もない話)

ケースの確認がさ、大変なんだよね。
そもそも、タイミングとかで大丈夫なケースが出てきたりするし。
そんなら、動かなくしちゃいましょうね~という話。

多重起動禁止のやり方

プログラム起動時に一番初めに実行される
Program.csのMain関数に手を入れていきます。
フォームアプリケーションでプロジェクト作成していると、
あんまり触らない部分かもしれないですね。

メイン関数の中身は、はじめこんな感じだと思います。

// アプリケーション開始
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());

 

このままだと、MainFormが起動して普通に動作してしまうので、
前の部分に多重起動の禁止処理を追加していきます。

処理の内容としては、起動する際に特定の名前で
ミューテックスハンドラというものを取得しておいて
既に取得されていると取得に失敗するので、それを判断して
「2つ以上同時にアプリケーションを起動できなくしましょう」
という形で実装します。

下記のような形にします。
少し長いですが、割と出番が多いので、自分用に。

// ミューテックスハンドラの取得
string mutex_name = "XXXXXX";         // ミューテックスハンドラ名前
System.Threading.Mutex mutex = new System.Threading.Mutex( false, mutex_name );
bool handle = false;

try
{
    // ミューテックスハンドラの取得
    try
    {
        handle = mutex.WaitOne(0, false);
    }
    catch( System.Threading.AbandonedMutexException )
    {
        handle = true;
    }

    // ミューテックスハンドラの取得に失敗した場合
    // すでに同じアプリケーションが起動しているので、多重起動禁止する
    if (handle == false )
    {
        // ミューテックス所有権が得られなかった場合、多重起動状態にある
        // エラーメッセージを表示して、処理を終了する。
        MessageBox.Show("このアプリケーションは多重起動することはできません。");
        return;
    }

    // アプリケーションを開始する
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new MainForm());
}
finally
{
    // アプリケーション終了時処理
    // 起動時に取得したミューテックスハンドラを開放する
    if (handle)
    {
        mutex.ReleaseMutex();
    }
    mutex.Close();
}

既にアプリケーションが起動していて、さらにもう一つ起動しようとした場合は、
新たにミューテックスハンドラを取得することができないので、
エラーメッセージを表示して起動できずに終了します。

既に起動していたアプリケーションを終了させれば、
ミューテックスハンドラは取得できるようになるため、
アプリケーションを起動できるようになります。

結果として、起動できるのは常に1つまで、となりますね!

ではでは



0 件のコメント:

コメントを投稿