Что вы подразумеваете под «прерванным», неясно.
Прерывание по исключению
private bool SomeLockingMethod(object foo)
{
// Verify foo is valid
try
{
lock(foo)
{
while(something)
{
// Do stuff
Thread.Sleep(1); // Possibly yield to another
// thread calling Thread.Interrupt
}
}
return true;
}
catch(ThreadInterruptedException ex)
{
// Handle exception
}
return false;
}
Если return true
не достигнут, то что-то случилось, пока удерживалась блокировка на foo
, и код возвращает false
. В любом случае блокировка автоматически снимается.
Другой поток может прервать этот вызов, вызвав Thread.Interrupt
.
«Прерывание» из кода
Если вы единственный, кто "прерывает" код, это может быть так просто, как
private bool SomeLockingMethod(object foo)
{
// Verify foo is valid
lock(foo)
{
// Do stuff
if(shouldInterrupt)
{
return false;
}
// Do more stuff
}
return true;
}
Опять же, блокировка автоматически снимается, независимо от того, происходит ли «прерывание».
Прерывание, потому что кто-то еще пытается захватить замок
Возможно, это то, что вы ищете; в этом случае вы можете использовать что-то еще, например Semaphore
или ManualResetEvent
.