2

我正在查看一些代码,其中一个代码分析 (fxCop) 警告让我非常困惑。该代码通过在类的开头创建变量来实现一些互斥锁,类似于:

private Mutex myMutex = new Mutex();

fxCop 弹出一条消息,说我必须为该类实现 IDisposable ,因为 Mutex 类实现了它 - 这是警告CA1001。但是看着 Mutex 它没有处置方法。

事实证明,Mutex 使用SafeWaitHandle(它实现了 IDisposable - 猜测这就是 fxCop 正在接受的),但 mutex 实际上并没有通过标准的一次性模式处理它。它有一个私有方法,使用RuntimeHelpers.CleanupCode分配给委托,据我了解,这意味着它将在异常上运行。

这就提出了两个问题:

  1. 互斥量是否正确实施?如果 Mutex 中没有异常,则永远不会释放 SafeWaitHandle。
  2. 我应该在我的处置中调用什么来清理互斥锁?
4

2 回答 2

5

Mutex IDisposable.Dispose通过其基类显式实现WaitHandle根据指南Dispose,它通过其公共Close方法(也继承自)公开功能WaitHandle,这是 dispose 模式的有效实现:

有时,特定于域的名称比 Dispose 更合适。例如,文件封装可能要使用方法名称 Close。在这种情况下,请私下实现 Dispose 并创建一个调用 Dispose 的公共 Close 方法。(...) 您可以将 Close 替换为适合您的域的方法名称。

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

于 2009-09-25T14:26:26.163 回答
0

在 VS 2013 Pro Update 2 下使用 Close() 函数仍然会生成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();
 }
于 2014-08-13T12:07:40.430 回答