所以这告诉我应该在我的代码末尾放置一个GC.KeepAlive以保持我的互斥锁打开(以防止我的应用程序的多个实例由于我的互斥锁的早期 GC 处理而发生)。但是我应该将 KeepAlive 放在 finally 块中还是放在 try 块的末尾?
问问题
289 次
1 回答
5
我个人不会使用这种方法。
问题是您需要在应用程序代码(在本例中为表单)完成后使用互斥锁,否则它将成为 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 语句创建的 finally 将阻止互斥锁成为 GC 候选对象。我个人觉得这个代码不那么混乱和简洁。
话虽如此,如果您想遵循该链接中的方法,只需将 KeepAlive 放在任何地方都会导致互斥锁不被收集,并防止出现问题。你可以把它放在你的 try 或 finally 块中——只要它在主应用程序代码“完成”之后。您也可以忽略这一点并明确地Dispose()
使用互斥锁 - 只要您以某种方式使用互斥锁,就可以了。
于 2010-10-06T00:04:24.160 回答