Sintaxe para bloqueio de interrupção em C #
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.
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.