В своей статье о предотвращении нескольких экземпляров приложения Майкл Ковингтон представляет этот код:
static void Main() // args are OK here, of course
{
bool ok;
m = new System.Threading.Mutex(true, "YourNameHere", out ok);
if (! ok)
{
MessageBox.Show("Another instance is already running.");
return;
}
Application.Run(new Form1()); // or whatever was there
GC.KeepAlive(m); // important!
}
Он объясняет, что GC.KeepAlive (m) требуется, чтобы сборщик мусора не собирал мьютекс на ранней стадии, поскольку на него нет дополнительных ссылок.
Мой вопрос: будет ли перенос мьютекса в использование делать то же самое? То есть, следующее также помешает GC вытащить коврик из-под меня?
static void Main() // args are OK here, of course
{
bool ok;
using (var m = new System.Threading.Mutex(true, "YourNameHere", out ok))
{
if (! ok)
{
MessageBox.Show("Another instance is already running.");
return;
}
Application.Run(new Form1()); // or whatever was there
}
}
Моя внутренняя реакция заключается в том, что использование будет работать, поскольку использование (должно быть) эквивалентно:
Mutex m = new System.Threading.Mutex(true, "YourNameHere", out ok);
try
{
// do stuff here
}
finally
{
m.Close();
}
И я думаю, что m.Close () будет достаточно, чтобы сообщить компилятору JIT, что есть еще одна ссылка, предотвращая преждевременную сборку мусора.