Я просматриваю код, и одно из предупреждений анализа кода (fxCop) меня очень смутило. Код реализует несколько мьютексов путем создания переменные в начале класса, примерно так:
private Mutex myMutex = new Mutex();
fxCop выскакивает с сообщением о том, что я должен реализовать IDisposable для класса, поскольку класс Mutex реализует его - это предупреждение CA1001. Однако, глядя на Mutex, у него нет метода удаления.
Оказывается, Mutex использует SafeWaitHandle ( который реализует IDisposable - предполагая, что это то, что улавливает fxCop), но мьютекс на самом деле не удаляет его с помощью стандартного одноразового шаблона. У него есть частный метод, который назначается делегату с помощью RuntimeHelpers.CleanupCode, что, как я понимаю, означает, что он будет запускаться при исключении.
Это вызывает два вопроса:
- Правильно ли реализован Mutex? Если в Mutex нет исключения, SafeWaitHandle никогда не будет удален.
- Что мне следует вызвать в моей утилите для очистки мьютекса?