これは非常にばかげた質問だと思います: C# で中断可能なロック ステートメントの正しい構文は何ですか? たとえば、ロックを取得します。ロックされたコードが終了する前にロックが中断された場合は、外側のメソッドから false を返します。おそらく完全に間違った用語です...ありがとう。
4 に答える
を使用してロックを取得中にタイムアウトを設定できます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
。どちらの方法でも、ロックは自動的に解除されます。
別のスレッドが を呼び出すことで、このスレッドに割り込むことができます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
。
また、2.0で追加されたトランザクションスコープを確認することもできます。これは、探しているものである可能性があります(質問のあいまいさのため、不明です)。これにより、いくつかのアクションを試行し、それらのアクションが適切に完了しなかった場合はロールバックできます。
詳細については、こちらをご覧ください。
あなたがここで何を得ようとしているのかわからない。このステートメントの目的は、lock
中断されないようにして、一貫した動作を確保できるようにすることです。
ここで何を達成しようとしていますか?