2

いくつかのコードを見直していますが、コード分析 (fxCop) の警告の 1 つに非常に混乱しています。このコードは、次のように、クラスの開始時に変数を作成することにより、いくつかのミューテックスを実装します。

private Mutex myMutex = new Mutex();

fxCop は、Mutex クラスが実装しているため、クラスに IDisposable を実装する必要があるというメッセージを表示しています。これは警告CA1001です。ただし、Mutex を見ると、dispose メソッドがありません。

Mutex はSafeWaitHandle (これは IDisposable を実装しています - これが fxCop が拾っているものだと推測します) を使用しますが、mutex は実際には標準の破棄可能なパターンを介してそれを破棄しません。RuntimeHelpers.CleanupCodeを使用してデリゲートに割り当てられるプライベート メソッドがあります。これは、私が理解しているように、例外で実行されることを意味します。

これにより、次の 2 つの疑問が生じます。

  1. Mutex は正しく実装されていますか? Mutex に例外がない場合、SafeWaitHandle は破棄されません。
  2. ミューテックスをクリーンアップするには、dispose で何を呼び出す必要がありますか?
4

2 に答える 2

5

Mutex IDisposable.Dispose基本クラスを通じて明示的に実装WaitHandleします。ガイドラインに従って、破棄パターンの有効な実装であるDisposepublicCloseメソッド ( からも継承) を介して機能を公開します。WaitHandle

ドメイン固有の名前が Dispose よりも適切な場合があります。たとえば、ファイルのカプセル化ではメソッド名 Close を使用したい場合があります。この場合、Dispose をプライベートに実装し、Dispose を呼び出すパブリックの Close メソッドを作成します。(...) Close をドメインに適したメソッド名に置き換えることができます。

のいくつかのクラスSystem.IOもこの方法で行います。

于 2009-09-25T14:26:26.163 に答える
0

Close () 関数を使用しても、 VS 2013 Pro Update 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();
 }
于 2014-08-13T12:07:40.430 に答える