.Net4, Monitor.Enter (lockObject, приобрела блокировку)
-
06-07-2019 - |
Вопрос
В .Net4, Monitor.Enter (Object) помечен как устаревший:
[ObsoleteAttribute("This method does not allow its caller to reliably release the lock. Please use an overload with a lockTaken argument instead.")]
public static void Enter(
Object obj
)
И есть новый метод Monitor.Enter ( lockObject, приобрелLock) с этим использованием:
bool acquiredLock = false;
try
{
Monitor.Enter(lockObject, ref acquiredLock);
// Code that accesses resources that are protected by the lock.
}
finally
{
if (acquiredLock)
{
Monitor.Exit(lockObject);
}
}
Раньше я делал это так:
Monitor.Enter(lockObject);
try
{
// Code that accesses resources that are protected by the lock.
}
finally
{
Monitor.Exit(lockObject);
}
Это неправильно? Зачем ?
Может быть, с перерывом после входа, но до попытки?
Как спросил Имон Нербонн: что произойдет, если в окончательном виде перед монитором monitor.exit возникнет асинхронное исключение?
Ответ: ThreadAbortException
Когда возникает это исключение, Runtime выполняет все, наконец, блоки до окончания потока.
Решение
Как вы предлагаете прямо в конце вопроса, проблема в том, что асинхронное исключение может быть вызвано после вызова Monitor.Enter
, но перед вводом блока try
.
Новый способ работы гарантирует, что в любом случае вы попадете в блок finally и сможете снять блокировку , если вы ее приобрели. (Вы можете не получить его, например, если Monitor.Enter
выдает исключение.)
IIRC, это новое поведение ключевого слова lock
при таргетинге на .NET 4.0.