Должен ли я использовать 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