Синтаксис прерываемой блокировки в C # - PullRequest
0 голосов
/ 03 марта 2009

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

Ответы [ 4 ]

2 голосов
/ 03 марта 2009

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

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

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

1 голос
/ 03 марта 2009

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

Прерывание по исключению

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 голосов
/ 03 марта 2009

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

Подробнее см. Здесь .

0 голосов
/ 03 марта 2009

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

Чего ты здесь пытаешься достичь?

...