Лично я бы не использовал этот подход.
Проблема в том, что вам нужно что-то использовать, используя мьютекс после завершения кода приложения (в данном случае, формы), или это будет кандидатом для пост-оптимизации GC.
Поскольку Mutex реализует IDisposable , вы можете так же легко сделать это:
[STAThread]
static void Main() // args are OK here, of course
{
bool ok;
using(var mutex = new System.Threading.Mutex(true, "YourNameHere", out ok))
{
if (!ok)
{
MessageBox.Show("Another instance is already running.");
return;
}
Application.Run(new Form1());
}
}
Это будет работать так же хорошо, так как окончательно созданный оператор using не позволит мьютексу быть кандидатом в GC. Лично я считаю этот код менее запутанным и понятным.
При этом, если вы хотите следовать подходу по этой ссылке, простое размещение KeepAlive в любом месте приведет к тому, что мьютекс не будет собран, и предотвратит проблему. Вы можете поместить его в свой блок try или finally - до тех пор, пока он не завершит основной код приложения. Вы также можете игнорировать это и просто явно Dispose()
мьютекс - если вы каким-то образом используете мьютекс, все будет хорошо.