2009-03-03 2 views
0

Я подозреваю, что это очень глупый вопрос: какой правильный синтаксис для оператора прерывистой блокировки в C#? Например. получить блокировку; если блокировка прервана перед завершением кода, верните false из метода размещения. Наверное, совершенно неправильная терминология ... Спасибо.Синтаксис для прерывистой блокировки в C#

+0

Вы решили проблему? –

+0

Спасибо, что спросили, @ Daniel L! У меня есть код, который, кажется, делает трюк, но на самом деле я не буду знать наверняка, пока многие люди не воспользуются моим кодом в течение значительного количества времени! До сих пор это выглядит неплохо! –

ответ

2

У вас может быть тайм-аут, в то время как приобретение блокировка с использованием Monitor.TryEnter; а также в замке вы можете делать такие вещи, как Monitor.Wait/Monitor.Pulse, чтобы временно получить блокировку, но вы не можете прерваться как таковой.

Момент прерывания основного времени может быть в Thread.Sleep, который может быть прерван Thread.Interrupt - но опять же, это не приведет к отключению управления из блока метода выполнения.

Что именно вы пытаетесь достичь? С большим контекстом мы можем, вероятно, помочь больше ...

+0

Что вы имели в виду под термином «вы не можете прерваться как таковое»? Конечно, любой метод прерывается ...? –

+0

Некоторые элементы взаимодействия полностью не прерываются. И даже если это может быть прервано (через исключение) - вы, вероятно, не должны. –

1

Что вы подразумеваете под «прерыванием», неясно.

Прерывание по отклонениям

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.

+0

Я пытаюсь реплицировать Java-код, который управляет ограниченным буфером. Receive and Send - синхронизированные методы. Часть получателя выглядит следующим образом: символически: пустым { try { wait(); } задвижка (InterruptedException е) { возвращение ложным }} Аналогично для Send, используя полный –

+0

@Paul: Я обновил свой ответ, чтобы отразить это; Теперь он показывает, как вы будете использовать «Thread.Interrupt» и пойманный «ThreadInterruptedException» –

+0

Это замечательно! Спасибо, @Daniel –

0

Я не уверен, что вы пытаетесь получить здесь. Назначение инструкции lock состоит в том, что вы не должны прерываться, чтобы обеспечить последовательное поведение.

Что вы пытаетесь достичь здесь?

0

Возможно, вы также можете взглянуть на область транзакций, добавленную в 2.0, что может быть тем, что вы ищете (неизвестно из-за двусмысленности в вашем вопросе). Это позволяет вам совершать некоторые действия, а затем откатываться, если эти действия не были выполнены должным образом.

See here для получения более подробной информации.