2010-10-05 53 views
4

所以this告诉我,我应该在我的代码末尾加上一个GC.KeepAlive,以保持我的互斥体处于打开状态(以防止由于GC早期处理我的互斥体而导致出现多个应用程序实例)。但是,我应该将KeepAlive放在我的finally块还是放在try块的最后?我应该把KeepAlive放入我的finally块吗?

+2

看到这个:http://stackoverflow.com/questions/635640/gc-keepalive-versus-using – 2010-10-06 00:02:19

回答

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()这个互斥量 - 只要你用某种方式使用互斥量,它就没问题。

相关问题