Резюме:Как я могу избавиться от заброшенных мьютексов?
Есть ли способ, чтобы очистить мьютекс, если процесс, который создал его умер и ушел?
Детали:
Я использую семафор, чтобы убедиться, что только один экземпляр моих пробегов приложений.
При тестировании какого-либо нового кода (для автоматического обновления) я запускал Environment.Exit (0). Во время работы в режиме отладки мой мьютекс был очищен.
Но когда я изменил сборку, чтобы быть «Release», то мьютекс остается вокруг после вызова выхода и помечается как покинутый:
Я проверил, чтобы убедиться, что не существует процесс, все еще запущенный, к которому прикреплен этот мьютекс.
Теперь каждый раз, когда я запускаю свое приложение, он считает, что мьютекс все еще существует и не запускает мое приложение. (Это также выходит из строя, потому что он пытается отправить сообщение в «запущенный» экземпляр приложения, чтобы показать себя.)
Я попытался освободить мьютекс так:
bool createdNew;
string applicationId = "18773:TestStudio";
var singleInstanceMutex = new Mutex(true, applicationId, out createdNew);
singleInstanceMutex.Close(); // Tried ReleaseMutex() too
но, конечно, просто получает его, а затем освобождает его.
Я знаю, что могу просто перезагрузиться, но я надеюсь на лучшее исправление в случае, если это когда-либо произойдет в производстве.
Есть ли способ очистить мьютекс, если процесс, который его создал, мертв и ушел?
Согласно вашему снимку экрана 3 вещи все еще ссылаются на него. Закройте все, что еще есть. –
@Scott Chamberlain - Ссылка остается, но процесс давно ушел. Он умер таким образом, что не освобождает ссылку. Отсюда мой вопрос о том, как высвободить мьютекс. – Vaccano
@ Vccano, тогда у вас есть одна из двух ситуаций. Коррумпированная установка ОС, или что-то имеет ссылку, которую вы не понимаете, берет ссылку. Если он действительно исчез, то счет будет равен 0, очистка дескрипторов от неудачных процессов была исправлена в Windows 95 (или 98, я не могу вспомнить, какие). Вероятная ситуация заключается либо в том, что программа еще не мертва, а что-то еще сохраняет ее, когда вы думаете, что она мертва или какая-то другая программа (IIS, антивирус, кто знает) подбирает ручку и не отпускает ее. –