3

で作業項目をキューに入れましたThreadPoolが、処理するデータがない場合(からの読み取りBlockingQueue)、作業項目がブロックされたとします。キューが空で、キューに入る作業がなくなるThread.Interrupt場合、ブロッキングタスクを中断する場合はメソッドを呼び出す必要がありますが、?を使用して同じことを行うにはどうすればよいThreadPoolですか?

コードは次のようになります。

void Run()
{
    try
    {
        while(true)
        {
            blockingQueue.Dequeue();
            doSomething();
        }
    }
    finally
    {
        countDownLatch.Signal();
    }
}

この状況で最善を尽くすのは通常の方法を使用することですが、作業項目を中断する同等の方法Threadがあるかどうか疑問に思っています。ThreadPool

4

1 に答える 1

2

それはどれBlockingQueueですか?それはBCLクラスですか?TPLクラス?またはカスタム?

どんなに; 単純に-私はしません。スレッドの初期段階でスレッド参照を保存するために何かを行うこともできThreadPoolますが、実行時間が長くなっているように見えるため、このジョブにはforを使用しません。常連のThread方が適切だと思われます。

また、すべてのワーカーを解放するようにキューに指示する組み込みの方法がないことにも驚いています。以前にブロッキングキューを作成したことがあり、次のパターンを使用する傾向があります(たとえば、ここから)。

public bool TryDequeue(out T value) {...}

これとともに:

  • データがある場合はすぐにtrueを返します
  • データがないが一部が追加された場合、ブロックして(最終的に)trueを返します
  • キューがシャットダウンされている場合、ブロックして(最終的に)falseを返します
于 2010-03-12T05:27:50.143 に答える