Я создал следующую тестовую программу:
static void Main(string[] args)
{
using (var mutex = new Mutex(false, "foobar"))
{
Console.WriteLine("Created mutex");
try
{
try
{
if (!mutex.WaitOne(TimeSpan.FromSeconds(5), false))
{
Console.WriteLine("Unable to acquire mutex");
Environment.Exit(0);
}
}
catch (AbandonedMutexException)
{
Console.WriteLine("Mutex was abandoned");
}
Console.WriteLine("Acquired mutex - sleeping 10 seconds");
Thread.Sleep(10000);
}
finally
{
mutex.ReleaseMutex();
Console.WriteLine("Released mutex");
}
}
Идея состоит в том, что я запускаю программу, и пока поток спит в течение 10 секунд, я убиваю процесс через диспетчер задач.В следующий раз, когда я запустю процесс, я ожидаю, что AbandonedMutexException
будет пойман на вызове WaitOne()
.Но я не вижу вывод "Mutex был заброшен".
В документации MSDN упоминается следующее:
Когдапоток отменяет мьютекс, исключение выдается в следующем потоке, который получает мьютекс.
Однако похоже, что ОС освобождает мьютекс, когда мой процесс завершается (а не другой поток внутрито же приложение).
Есть ли у меня возможность обнаружить мьютекс, оставленный таким образом?