C# 我应该把KeepAlive放在我的最后一块吗?

C# 我应该把KeepAlive放在我的最后一块吗?,c#,.net,garbage-collection,mutex,keep-alive,C#,.net,Garbage Collection,Mutex,Keep Alive,所以告诉我,我应该在代码的末尾添加一个标记,以保持我的互斥锁处于打开状态(以防止由于早期GC处理我的互斥锁而导致我的应用程序出现多个实例)。但是我应该把KeepAlive放在finally块中还是放在try块的末尾呢?我个人不会使用这种方法 问题是,在应用程序代码(在本例中为表单)完成后,您需要使用互斥体,否则它将成为GC后期优化的候选对象 因为,您可以轻松地执行以下操作: [STAThread] static void Main() // args are O

所以告诉我,我应该在代码的末尾添加一个标记,以保持我的互斥锁处于打开状态(以防止由于早期GC处理我的互斥锁而导致我的应用程序出现多个实例)。但是我应该把KeepAlive放在finally块中还是放在try块的末尾呢?

我个人不会使用这种方法

问题是,在应用程序代码(在本例中为表单)完成后,您需要使用互斥体,否则它将成为GC后期优化的候选对象

因为,您可以轻松地执行以下操作:

[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()
mutex-只要以某种方式使用mutex,就可以了。

请参见: