在他关于防止应用程序的多个实例的文章中,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) 来防止垃圾收集器提前收集互斥锁,因为没有额外的引用。
我的问题:将互斥体包装在 using 中会做同样的事情吗?也就是说,以下内容还会阻止 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
}
}
我的直觉反应是 using 会起作用,因为 using (应该)相当于:
Mutex m = new System.Threading.Mutex(true, "YourNameHere", out ok);
try
{
// do stuff here
}
finally
{
m.Close();
}
而且我认为 m.Close() 足以向 JIT 编译器发出另一个引用的信号,从而防止过早的垃圾收集。