Вопрос

Я подозреваю, что это очень глупый вопрос:каков правильный синтаксис для оператора прерываемой блокировки в 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, которая может быть тем, что вы ищете (неизвестно, из-за двусмысленности вашего вопроса).Это позволяет вам предпринять некоторые действия, а затем выполнить откат, если эти действия не были выполнены должным образом.

Смотрите здесь для получения более подробной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top