Я подозреваю, что это очень глупый вопрос: какой правильный синтаксис для оператора прерывистой блокировки в C#? Например. получить блокировку; если блокировка прервана перед завершением кода, верните false из метода размещения. Наверное, совершенно неправильная терминология ... Спасибо.Синтаксис для прерывистой блокировки в C#
ответ
У вас может быть тайм-аут, в то время как приобретение блокировка с использованием Monitor.TryEnter
; а также в замке вы можете делать такие вещи, как Monitor.Wait
/Monitor.Pulse
, чтобы временно получить блокировку, но вы не можете прерваться как таковой.
Момент прерывания основного времени может быть в Thread.Sleep, который может быть прерван Thread.Interrupt - но опять же, это не приведет к отключению управления из блока метода выполнения.
Что именно вы пытаетесь достичь? С большим контекстом мы можем, вероятно, помочь больше ...
Что вы имели в виду под термином «вы не можете прерваться как таковое»? Конечно, любой метод прерывается ...? –
Некоторые элементы взаимодействия полностью не прерываются. И даже если это может быть прервано (через исключение) - вы, вероятно, не должны. –
Что вы подразумеваете под «прерыванием», неясно.
Прерывание по отклонениям
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
.
Я пытаюсь реплицировать Java-код, который управляет ограниченным буфером. Receive and Send - синхронизированные методы. Часть получателя выглядит следующим образом: символически: пустым { try { wait(); } задвижка (InterruptedException е) { возвращение ложным }} Аналогично для Send, используя полный –
@Paul: Я обновил свой ответ, чтобы отразить это; Теперь он показывает, как вы будете использовать «Thread.Interrupt» и пойманный «ThreadInterruptedException» –
Это замечательно! Спасибо, @Daniel –
Я не уверен, что вы пытаетесь получить здесь. Назначение инструкции lock
состоит в том, что вы не должны прерываться, чтобы обеспечить последовательное поведение.
Что вы пытаетесь достичь здесь?
Возможно, вы также можете взглянуть на область транзакций, добавленную в 2.0, что может быть тем, что вы ищете (неизвестно из-за двусмысленности в вашем вопросе). Это позволяет вам совершать некоторые действия, а затем откатываться, если эти действия не были выполнены должным образом.
See here для получения более подробной информации.
Вы решили проблему? –
Спасибо, что спросили, @ Daniel L! У меня есть код, который, кажется, делает трюк, но на самом деле я не буду знать наверняка, пока многие люди не воспользуются моим кодом в течение значительного количества времени! До сих пор это выглядит неплохо! –