异步启动一个任务来处理静态队列,在完成时停止

时间:2012-04-09 20:47:30

标签: .net-4.0 parallel-processing task-parallel-library

基本上我有一个我想要处理的静态自定义对象队列。在多个线程中,我需要启动一个单独的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 个答案:

答案 0 :(得分:2)

您可能需要考虑在此处使用BlockingCollection<T>。您可以使自定义队列实现IProducerConsumerCollection,在这种情况下BC可以直接使用它。

然后,您只需要启动一个长时间运行的任务来调用blockingCollection.GetConsumingEnumerable()并处理foreach中的项目。当集合为空时,任务将自动阻止,并在新项目为Enqueued时重新启动。