2009-09-25 64 views
2

我正在评论一些代码,其中一个代码分析(fxCop)警告让我非常困惑。该代码通过在课程开始创建变量实现几个mutex的,与此类似:互斥体是否正确实施,我该如何处置它?

private Mutex myMutex = new Mutex(); 

的FxCop与一条消息,说我必须实现IDisposable的类作为互斥类实现弹出它 - 这是警告CA1001。然而看着Mutex它没有处理方法。

原来Mutex使用SafeWaitHandle(它实现了IDisposable - 猜测这是fxCop正在拾取的东西),但互斥并不实际通过标准的一次性模式处置它。它有一个使用RuntimeHelpers.CleanupCode分配给代理的私有方法,据我了解这意味着它将运行在异常情况下。

这带来了两个问题:

  1. 是互斥正确实施?如果互斥体中没有异常,那么SafeWaitHandle将永远不会被丢弃。
  2. 我应该怎样称呼我清理互斥锁?

回答

5

Mutex明确实现IDisposable.Dispose通过其基类WaitHandle。它暴露了通过其公共Close方法Dispose功能(也WaitHandle继承),这是Dispose模式的有效实施,according to the guidelines

偶尔特定的域名是 比的Dispose更合适。例如,对于 示例,文件封装可能要使用 方法名称Close。在 这个案例中,执行私下配置 并创建一个公开的Close方法, 调用Dispose。 (...)您可以用适合您的域名的方法名称 替换Close。

System.IO中的几个类也是这样做的。

+0

卫生署,当然它确实:)我看到齿轮转身这是有意义的时刻。 – 2009-09-25 14:33:01

0

使用Close()函数仍会在VS 2013 Pro更新2下生成CA2000。 由于其保护级别,Dispose()函数无法访问。

那么,有没有一个错误,或者这是从VS的代码分析中的错误?

编辑: 使用此代码解决:

Mutex MyApplicationMutex = null; 
try 
{ 
    MyApplicationMutex = new Mutex(true, Program.g_ApplicationMutexName); 
    if (MyApplicationMutex.WaitOne(0, false)) 
    { 
    ... 
    } 
} 
finally 
{ 
    // Dispose Mutex 
    if (MyApplicationMutex != null) 
    MyApplicationMutex.Close(); 
}