質問

これは非常に馬鹿げた質問だと思います。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で追加されたトランザクションスコープを確認することもできます。これは、探しているものかもしれません(不明な点、質問のあいまいさのため)。これにより、いくつかのアクションを試行し、それらのアクションが適切に完了しなかった場合にロールバックできます。

詳細はこちらをご覧ください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top