Должен ли я избавиться от Mutex?
Я работаю над двумя службами Windows, которые имеют общую базу данных, которую я хочу заблокировать (кросс-процесс) с помощью системы Mutex.
Теперь мне интересно, можно ли просто позвонить WaitOne()
а также ReleaseMutex()
в try-finally
блок или я должен также утилизировать Mutex (например, в using
блок). Если так, я думаю, я всегда должен ловить AbandonedMutexException
на WaitOne()
метод или я здесь не прав?
3 ответа
Мьютекс - это объект ядра Windows (здесь он заключен в объект.NET).
Как таковой, это неуправляемый ресурс, который должен быть утилизирован.
Точнее, объект.NET содержит HANDLE для мьютекса, который должен быть как-то освобожден / утилизирован.
Я не доверяю тому примеру кода в документах класса Mutex, где объект мьютекса не расположен. Хотя у Henzi есть хороший комментарий: объект Mutex является статическим и может быть уничтожен финализатором или уничтожен ядром Windows при выходе из процесса.
Также обратите внимание, что Close() также удаляет объект.
Конечно, нет ничего плохого в сохранении существующего объекта Mutex в вашем приложении, даже если вы его не используете. Это легкие ресурсы.
В соответствии с этим Mutex
автоматически уничтожается, когда последний процесс, содержащий HANDLE
этого Mutex заканчивается.
В неуправляемых терминах MSDN говорит
Использовать
CloseHandle
Функция, чтобы закрыть ручку. Система закрывает ручку автоматически, когда процесс завершается. Объект мьютекса уничтожается, когда его последний дескриптор был закрыт.
В.NET вы должны позвонить .Close()
на Mutex
- это освобождает HANDLE
... так как каждый процесс имеет свой HANDLE
при доступе даже к тому же имени Mutex
это последовательная практика... не зовет Close()
не оставит никаких проблем, как только процесс больше не будет (финализаторы и все)...
Вам необходимо избавиться от ресурсов, которые используются ручкой ожидания.
Из документации:
Освобождает все ресурсы, используемые текущим экземпляром класса WaitHandle. (Унаследовано от WaitHandle.)
Ручка ожидания использует неуправляемые ресурсы, которые должны быть утилизированы в конце использования.