いくつかのコードを見直していますが、コード分析 (fxCop) の警告の 1 つに非常に混乱しています。このコードは、次のように、クラスの開始時に変数を作成することにより、いくつかのミューテックスを実装します。
private Mutex myMutex = new Mutex();
fxCop は、Mutex クラスが実装しているため、クラスに IDisposable を実装する必要があるというメッセージを表示しています。これは警告CA1001です。ただし、Mutex を見ると、dispose メソッドがありません。
Mutex はSafeWaitHandle (これは IDisposable を実装しています - これが fxCop が拾っているものだと推測します) を使用しますが、mutex は実際には標準の破棄可能なパターンを介してそれを破棄しません。RuntimeHelpers.CleanupCodeを使用してデリゲートに割り当てられるプライベート メソッドがあります。これは、私が理解しているように、例外で実行されることを意味します。
これにより、次の 2 つの疑問が生じます。
- Mutex は正しく実装されていますか? Mutex に例外がない場合、SafeWaitHandle は破棄されません。
- ミューテックスをクリーンアップするには、dispose で何を呼び出す必要がありますか?