В статье о предотвращении нескольких экземпляров приложения Michael Covington представляет этот код:
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, что есть еще одна ссылка, тем самым предотвращая преждевременную сбор мусора.