我正在查看一些代码,其中一个代码分析 (fxCop) 警告让我非常困惑。该代码通过在类的开头创建变量来实现一些互斥锁,类似于:
private Mutex myMutex = new Mutex();
fxCop 弹出一条消息,说我必须为该类实现 IDisposable ,因为 Mutex 类实现了它 - 这是警告CA1001。但是看着 Mutex 它没有处置方法。
事实证明,Mutex 使用SafeWaitHandle(它实现了 IDisposable - 猜测这就是 fxCop 正在接受的),但 mutex 实际上并没有通过标准的一次性模式处理它。它有一个私有方法,使用RuntimeHelpers.CleanupCode分配给委托,据我了解,这意味着它将在异常上运行。
这就提出了两个问题:
- 互斥量是否正确实施?如果 Mutex 中没有异常,则永远不会释放 SafeWaitHandle。
- 我应该在我的处置中调用什么来清理互斥锁?