【问题标题】:Should I put KeepAlive inside my finally block?我应该将 KeepAlive 放在 finally 块中吗?
【发布时间】:2010-10-06 08:04:24
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

问题是您需要在应用程序代码(在本例中为表单)完成后使用互斥锁,否则它将成为 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() 互斥锁 - 只要您以某种方式使用互斥锁,就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 2011-08-31
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多