В .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);
}
Это неправильно ? Почему ? Может быть, с прерыванием после ввода, но перед попыткой?
Как спросил Эймон Нербонн: что произойдет, если возникнет асинхронное исключение в finally прямо перед monitor.exit?
Ответ: ThreadAbortException
Когда возникает это исключение, среда выполнения выполняет все блоки finally перед завершением потока.