.Net4, Monitor.Enter (lockObject, gottenLock) - PullRequest
3 голосов
/ 23 октября 2009

In .Net4, Monitor.Enter (Объект) помечен как устаревший:

[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, acquainLock) с этим использованием:

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 выполняет все, наконец, блоки до окончания потока.

1 Ответ

5 голосов
/ 23 октября 2009

Как вы предлагаете прямо в конце вопроса, проблема в том, что асинхронное исключение может быть выдано после вызова Monitor.Enter, но до того, как вы войдете в блок try.

Новый способ ведения дел гарантирует, что в любом случае вы попадете в блок finally и сможете снять блокировку , если вы ее приобрели. (Вы можете не получить его, например, если Monitor.Enter выдает исключение.)

IIRC, это новое поведение ключевого слова lock при таргетинге на .NET 4.0.

...