В документации объясняется (в разделе «Замечания»), что существует концептуальная разница между экземпляром объекта Mutex (который делает не , фактически, делать что-либо особенное насколько синхронизация идет) и получение Mutex (с использованием WaitOne
). Обратите внимание, что:
WaitOne
возвращает логическое значение, что означает, что получение Mutex может сбой (время ожидания), и оба случая должны быть обработаны WaitOne
возвращает true
, тогда вызывающий поток приобрел Mutex и должен вызывать ReleaseMutex
, иначе Mutex перестанет false
], то вызывающий поток не должен вызывать ReleaseMutex
Итак, для мьютексов больше, чем для создания экземпляра. Что касается того, следует ли использовать using
в любом случае, давайте посмотрим, что делает Dispose
(поскольку унаследовано от WaitHandle
):
protected virtual void Dispose(bool explicitDisposing)
{
if (this.safeWaitHandle != null)
{
this.safeWaitHandle.Close();
}
}
Как мы можем см., Mutex выпущен не , но есть какая-то очистка, поэтому прилипание с using
было бы хорошим подходом.
Что касается того, как вы должны действовать, вы можете конечно, используйте блок try/finally
, чтобы убедиться, что, если Mutex получен, что он правильно выпущен. Это, вероятно, самый простой подход.
Если вы действительно не заботятся о случае, когда Mutex не может быть приобретен (что вы не указали, поскольку вы проходите мимо a TimeSpan
- WaitOne
), вы можете обернуть Mutex
в свой класс, который реализует IDisposable
, получить Mutex в конструкторе (используя WaitOne()
без аргументов) и выпустить его внутри Dispose
. Хотя, я бы, вероятно, не рекомендовал бы это, так как это заставило бы ваши потоки ждать бесконечно, если что-то пойдет не так, и независимо от того, есть веские причины для явной обработки обоих случаев при попытке приобретения, как упомянуто @HansPassant.