Ваша проблема на этой линии
_sessionMutex.WaitOne();
WaitOne () может выдать исключения , потому что какой-то другой поток, блокирующий его, завершается без , освобождая его
В вашем случае WaitOne выдает это исключение из-за отказа от того же мьютекса в другом потоке.
Я предлагаю деформировать ваш мьютекс в классе и использовать код вроде:
try
{
cLock = _sessionMutex.WaitOne();
// call your work
}
catch (AbandonedMutexException)
{
cLock = true;
// call your work
}
catch (Exception x)
{
//Error
}
finally
{
_sessionMutex.ReleaseMutex();
}
В приведенном выше коде ReleaseMutex может не запускаться, если пользователь останавливает / покидает страницу и поток теряет / удаляет ее. И именно поэтому вы получаете это исключение.
Остерегайтесь того, что мьютекс может навсегда заблокировать то, как вы это делаете! :) Лучше добавить предел ожидания в миллисекундах и / или обработать случай отсутствия блокировки для возврата данных только для чтения. Вы, пользователи, можете заблокировать на долгое время, если мьютекс не сможет пройти WaitOne ()
Также будьте осторожны, Мьютекс должен быть близко и утилизировать. ! Даже если это похоже на пример в MSDN, в MSDN это только простой пример, вы должны быть уверены, что закрыли и утилизировали свой Mutex, иначе вы увидите больше проблем при обновлении своей страницы. Например, если Mutex остается заблокированным в памяти, пока вы обновляете свою страницу, то ваша страница может блокироваться на долгое время, пока сборщик мусора не убьет ее, если они это сделают.