ただの覚え書きなので読みやすさとか考えてないです
二重起動を防止したいときに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