是否正确实施了互斥锁,如何处理它?

Rob*_*ean 2 .net mutex dispose idisposable waithandle

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

private Mutex myMutex = new Mutex();
Run Code Online (Sandbox Code Playgroud)

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

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

这提出了两个问题:

  1. Mutex是否正确实施?如果Mutex中没有例外,那么SafeWaitHandle永远不会被处理掉.
  2. 在处理清除互斥锁时我应该怎么称呼?

Jor*_*ren 5

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

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

有几个班级也是System.IO这样做的.