1

基本的に、処理したいオブジェクトの静的カスタム キューがあります。複数のスレッドから、キューに入れられたオブジェクトを処理する単一の Task を開始し、すべての項目がキューから取り出されたときにタスクを停止する必要があります。

いくつかの疑似コード:

static CustomQueue _customqueue;
static Task _processQueuedItems;

public static void EnqueueSomething(object something) {
    _customqueue.Enqueue(something);
    StartProcessingQueue();
}

static void StartProcessingQueue() {
   if(_processQueuedItems != null) {
      _processQueuedItems = new Task(() => {
        while(_customqueue.Any()) {
            var stuffToDequeue = _customqueue.Dequeue();
            /* do stuff */
        }
      });
     _processQueuedItems.Start();
   }
   if(_processQueuedItems.Status != TaskStatus.Running) {
      _processQueuedItems.Start();
   }
}

それが違いを生む場合、私のカスタムキューは、特定の年齢に達するまでアイテムを本質的に保持するキューであり、その後、それらをデキューできます。アイテムに触れるたびに、タイマーが再び開始されます。私はこの作品がうまくいくことを知っています。

私が苦労している部分は、並列処理です。(明らかに、ここで何をしているのかわかりません)。私が望むのは、キューが完了するまで 1 つのスレッドでキューを処理し、それから離れることです。別の呼び出しが入った場合、必要がない限り、新しいスレッドを開始しません。

それが私の問題をうまく説明してくれることを願っています。

4

1 に答える 1

2

ここでの使用を検討することをお勧めしBlockingCollection<T>ます。カスタムキューを実装することができますIProducerConsumerCollection。その場合、BCはそれを直接使用できます。

blockingCollection.GetConsumingEnumerable()次に、foreach内のアイテムを呼び出して処理するために、長時間実行されるタスクを開始する必要があります。コレクションが空になるとタスクは自動的にブロックされ、新しいアイテムが空になると再開されますEnqueued

于 2012-04-09T21:00:05.480 に答える