Вопрос

В .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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top