Pergunta

Eu suspeito que esta é uma pergunta muito idiota: o que é a sintaxe correta para uma instrução de bloqueio de interrupção em C #? Por exemplo. obter o bloqueio; se o bloqueio for interrompida antes acabamentos código bloqueados, retornar falso fora do método de inclusão. Provavelmente totalmente a terminologia errada ... Obrigado.

Foi útil?

Solução

Você pode ter um tempo limite enquanto aquiring um bloqueio usando Monitor.TryEnter; e da mesma forma, dentro de um bloqueio que você pode fazer coisas como Monitor.Wait / Monitor.Pulse para produzir temporariamente o bloqueio, mas você não pode ser interrompido como tal.

A principal interrupção tempo aplica-se pode estar em Thread.Sleep, que pode ser interrompido com Thread.Interrupt -. Não, mas novamente, isso vai puxão controlar fora de um bloco de método de execução

O que é exatamente isso que você está tentando alcançar? Com mais contexto, provavelmente, podemos mais ...

Outras dicas

O que você quer dizer com "interrompido" não é clara.

Interrupção por Exceção

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;
}

Se o return true não for alcançado, então algo aconteceu enquanto a fechadura da foo foi realizada, eo false retorna código. O bloqueio é liberada automaticamente, de qualquer forma.

Outro segmento pode interromper este chamando Thread.Interrupt .

"Interrupção" a partir do código

Se você é o único "interromper" o código, pode ser tão simples como

private bool SomeLockingMethod(object foo)
{
    // Verify foo is valid

    lock(foo)
    {
       // Do stuff

       if(shouldInterrupt)
       {
          return false;
       }

       // Do more stuff
    }

    return true;
 }

Mais uma vez, o bloqueio é liberado automaticamente, se existe ou não é uma "interrupção".

Interrupção porque alguém está tentando adquirir o bloqueio

Possivelmente este é o que você está procurando; neste caso, você pode querer usar outra coisa, como um Semaphore ou ManualResetEvent .

Eu não sei o que você está tentando chegar aqui. O objetivo da declaração lock é que você não deve ficar interrompido para que você possa garantir um comportamento consistente.

O que você está tentando realizar aqui?

Você também pode dar uma olhada no escopo de transação, acrescentou em 2.0, que pode ser o que você está procurando (desconhecido, devido a ambigüidade na sua pergunta). Ele permite que você tentar algumas ações, em seguida, reverter, se essas ações não foram concluídas corretamente.

Veja aqui para mais detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top