Исключение заброшенного мьютекса

Я пытаюсь использовать мьютекс в первый раз, и следующий код выполняется в двух отдельных экземплярах программы

public void asynchronousCode()
    {
        using (var mutex = new Mutex(false, "mySpecialMutex"))
        {
            if (!mutex.WaitOne(1000, false))
            {
                Console.WriteLine("First check - some one locked the mutex");
            }

            if (!mutex.WaitOne(3000, false))
            {
                Console.WriteLine("Second check- some one locked the mutex");
            }
            else
            {
                Console.WriteLine("I got the mutex");
                Console.WriteLine("sleeping");
                Thread.Sleep(3000);
                Console.WriteLine("Awaking and Releasing mutex");
                mutex.ReleaseMutex();
            }
        }
    }

Когда я запускаю это, один из экземпляров (тот, который я запускаю первым) печатает

I got the mutex
sleeping
awaking and releasing mutex

Другой экземпляр печатает

First check - some one locked the mutex

, и как только первый экземпляр арендует мьютекс, происходит сбой во втором операторе ожидания с исключением

The wait completed due to an abandoned mutex.

Любые идеи о том, почему я получаю это исключение и как я могу его предотвратить?

Решение: мне, вероятно, следовало более внимательно прочитать документацию по mdsn. Спасибо, Эндрю, за то, что указал мне правильное направление

Вы можете использовать метод WaitHandle.WaitOne, чтобы запросить владение мьютексом. мьютекс в повторных вызовах WaitOne, не блокируя его выполнение. поток должен вызвать метод ReleaseMutex одинаковое количество раз, чтобы освободить мьютекс. Класс Mutex обеспечивает идентификацию потока, поэтому мьютекс может быть освобожден только тем потоком, который его захватил.

13
задан nighthawk457 10 May 2012 в 18:27
поделиться