もしも、作成したプログラムが2つ、3つ起動された場合、ちゃんと動作するでしょうか?
文書を編集するようなプログラムであれば、複数起動できた方が便利かも知れません。
しかし、システム状態を監視するようなプログラムであれば1つだけ動作すれば十分です。むしろ複数動くと困るような場面も出てくるでしょう。
そんなときは、二重起動を防止して複数動作出来ないようにしてしまいましょう。
二重起動を防止する方法
二重起動を防止する方法としてはいろいろな方法があると思いますが、ここでは最も一般的と思われる方法を紹介します。
起動されたプログラムの初期処理で、既に起動されているものがあるかどうかを検出し、既に起動されている場合、自分自身を終了してあげるという方法です。
Mutex(ミューテックス)
Mutexとは、コンピュータで並列処理を行う際、同時に実行されているプログラム間で資源(リソース)の排他制御や同期を行うための仕組みの一つです。同時に一つのプログラムのみが資源を占有し、他のプログラムからの使用を排除する方式です。
似たようなものに『セマフォ』がありますが、ここでは説明は割愛します。
ソースコード
まずは、App.xaml に次のように記述します。
StartupイベントとExitイベントのイベントハンドラを追加しています。
<Application
x:Class="Sample.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="Application_Startup"
Exit="Application_Exit">
<Application.Resources>
</Application.Resources>
</Application>
次に、App.xaml.cs にハンドラを実装します。
// 特定の名前を付けたMutexを生成する
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "ApplicationName");
private void Application_Startup(object sender, StartupEventArgs e)
{
// Mutexの所有権を要求
if (!mutex.WaitOne(0, false))
{
// 既に起動しているため、終了する
mutex.Close();
this.Shutdown();
}
}
2行目の ”ApplicationName” の部分に特定の名前を付けておき、8行目で名前が既に使われているかどうか所有権を要求して確認します。
所有権を取得できなかった場合、別のプロセスで使用中ということなので自分自身は終了させています。
mutexの後片付けは忘れずに行うようにしましょう。
最後に、アプリケーションを終了するときにMutexを解放するのを忘れないようにしてください。
private void Application_Exit(object sender, ExitEventArgs e)
{
if (mutex != null)
{
mutex.ReleaseMutex();
mutex.Close();
}
}
まとめ
Mutexの解放を忘れてしまうと、ひとつも起動していないのにMutexの所有権を取得できず起動できないといったことになりますので注意してください。
コメント