Синтаксис прерываемой блокировки в C#
Вопрос
Я подозреваю, что это очень глупый вопрос:каков правильный синтаксис для оператора прерываемой блокировки в C #?Например.получить блокировку;если блокировка прерывается до завершения заблокированного кода, верните false из заключающего метода.Вероятно, совершенно неправильная терминология...Спасибо.
Решение
У вас может быть тайм-аут, пока приобретающий блокировка с использованием Monitor.TryEnter
;и точно так же, внутри блокировки вы можете делать такие вещи, как Monitor.Wait
/Monitor.Pulse
чтобы временно снять блокировку, но вас нельзя прервать как таковую.
Основное время, когда применяется прерывание, может быть в потоке.Спящий режим, который может быть прерван с помощью Thread.Прерывание - но опять же, это не выдернет управление из блока исполняемого метода.
Чего именно вы пытаетесь достичь?С большим контекстом мы, вероятно, сможем помочь больше...
Другие советы
Что вы подразумеваете под "прерванным", неясно.
Прерывание из-за исключения
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
.
Я не совсем понимаю, к чему вы здесь клоните.Цель этого lock
утверждение заключается в том, что вас не должны прерывать, чтобы вы могли обеспечить последовательное поведение.
Чего вы пытаетесь здесь добиться?
Вы также можете взглянуть на область действия транзакции, добавленную в версии 2.0, которая может быть тем, что вы ищете (неизвестно, из-за двусмысленности вашего вопроса).Это позволяет вам предпринять некоторые действия, а затем выполнить откат, если эти действия не были выполнены должным образом.
Смотрите здесь для получения более подробной информации.