我应该把KeepAlive放在我的finally块中吗?

时间:2010-10-05 23:58:05

标签: c# .net garbage-collection mutex keep-alive

所以this告诉我,我应该在我的代码末尾添加一个GC.KeepAlive来保持我的互斥锁打开(以防止我的应用程序的多个实例由于早期GC处理我的互斥锁而发生) 。但是我应该将KeepAlive放在我的finally块中还是在try块的末尾?

1 个答案:

答案 0 :(得分:5)

我个人不会使用这种方法。

问题是您需要在应用程序代码(在本例中为表单)完成后使用互斥锁,或者它将成为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语句创建将阻止互斥锁成为GC候选者。我个人认为,这个代码不那么令人困惑和清晰。

话虽这么说,如果您想要从该链接中遵循该方法,只需将KeepAlive放在任何地方都会导致互斥锁无法收集,并防止出现问题。您可以将它放在try或finally块中 - 只要它在主应用程序代码“完成”之后。你也可以忽略这一点并且只是明确地Dispose()互斥体 - 只要你以某种方式使用互斥锁,就可以了。