【发布时间】:2010-10-06 08:04:24
【问题描述】:
所以this 告诉我应该在我的代码末尾放置一个GC.KeepAlive 以保持我的互斥锁打开(以防止我的应用程序的多个实例由于我的互斥锁的早期 GC 处理而发生)。但是我应该将 KeepAlive 放在 finally 块中还是放在 try 块的末尾?
【问题讨论】:
标签: c# .net garbage-collection mutex keep-alive
所以this 告诉我应该在我的代码末尾放置一个GC.KeepAlive 以保持我的互斥锁打开(以防止我的应用程序的多个实例由于我的互斥锁的早期 GC 处理而发生)。但是我应该将 KeepAlive 放在 finally 块中还是放在 try 块的末尾?
【问题讨论】:
标签: c# .net garbage-collection mutex keep-alive
我个人不会使用这种方法。
问题是您需要在应用程序代码(在本例中为表单)完成后使用互斥锁,否则它将成为 GC 后优化的候选对象。
由于Mutex implements 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() 互斥锁 - 只要您以某种方式使用互斥锁,就可以了。
【讨论】: