0

これは非常にばかげた質問だと思います: C# で中断可能なロック ステートメントの正しい構文は何ですか? たとえば、ロックを取得します。ロックされたコードが終了する前にロックが中断された場合は、外側のメソッドから false を返します。おそらく完全に間違った用語です...ありがとう。

4

4 に答える 4

2

を使用してロックを取得中にタイムアウトを設定できますMonitor.TryEnter。同様に、ロック内ではMonitor.Wait/のようなことを実行Monitor.Pulseして一時的にロックを解放できますが、そのように中断することはできません。

割り込みが適用される主な時間は Thread.Sleep にある可能性があり、これは Thread.Interrupt で中断できますが、これは実行中のメソッド ブロックから制御をヤンクしません。

あなたが達成しようとしていることは正確には何ですか?より多くのコンテキストがあれば、おそらくもっと多くのことを助けることができます...

于 2009-03-03T01:36:22.370 に答える
1

「中断」の意味が不明です。

例外による中断

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

于 2009-03-03T01:22:03.560 に答える
0

また、2.0で追加されたトランザクションスコープを確認することもできます。これは、探しているものである可能性があります(質問のあいまいさのため、不明です)。これにより、いくつかのアクションを試行し、それらのアクションが適切に完了しなかった場合はロールバックできます。

詳細については、こちらをご覧ください。

于 2009-03-03T03:39:48.877 に答える
0

あなたがここで何を得ようとしているのかわからない。このステートメントの目的は、lock中断されないようにして、一貫した動作を確保できるようにすることです。

ここで何を達成しようとしていますか?

于 2009-03-03T01:26:46.200 に答える