質問
これは非常に馬鹿げた質問だと思います。C#の割り込み可能なロックステートメントの正しい構文は何ですか?例えば。ロックを取得します。ロックされたコードが終了する前にロックが中断された場合、囲むメソッドからfalseを返します。おそらく完全に間違った用語です...ありがとう。
解決
Monitor.TryEnter
を使用して、ロックを取得している間にタイムアウトを設定できます。同様に、ロック内で Monitor.Wait
/ Monitor.Pulse
などの操作を行って一時的にロックを解除できますが、そのように中断することはできません。
適用されるメインタイム割り込みはThread.Sleepにあり、これはThread.Interruptで割り込むことができます-ただし、これは実行中のメソッドブロックから制御をヤンクしません。
達成しようとしているのは正確に何ですか?コンテキストが多ければもっと役立つでしょう...
他のヒント
「中断」の意味不明瞭です。
例外による割り込み
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
を返します。いずれにしても、ロックは自動的に解除されます。
別のスレッドは、 < code> Thread.Interrupt 。
&quot;割り込み&quot;コードから
あなたが「中断」している場合コード、それは次のように簡単かもしれません
private bool SomeLockingMethod(object foo)
{
// Verify foo is valid
lock(foo)
{
// Do stuff
if(shouldInterrupt)
{
return false;
}
// Do more stuff
}
return true;
}
再び、「中断」の有無にかかわらず、ロックは自動的に解除されます。
他の誰かがロックを取得しようとしているために中断する
おそらくこれがあなたが探しているものです。この場合、 <など、他の何かを使用することもできます。 code>セマフォ または ManualResetEvent
。
ここで何を取得しようとしているのかわかりません。 lock
ステートメントの目的は、中断されないようにして、一貫した動作を確保できるようにすることです。
ここで何を達成しようとしていますか
また、2.0で追加されたトランザクションスコープを確認することもできます。これは、探しているものかもしれません(不明な点、質問のあいまいさのため)。これにより、いくつかのアクションを試行し、それらのアクションが適切に完了しなかった場合にロールバックできます。
詳細はこちらをご覧ください。