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