1

基本上我有一个我想要处理的对象的静态自定义队列。从多个线程中,我需要启动一个将处理排队对象的单个任务,当所有项目都出队时停止任务。

一些伪代码:

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();
   }
}

如果它有所不同,我的自定义队列是一个基本上保存项目直到它们达到一定年龄的队列,然后允许它们出列。每次触摸一个项目时,它的计时器都会重新启动。我知道这件作品很好。

我正在努力解决的部分是并行性。(显然,我不知道我在这里做什么)。我想要的是让一个线程处理队列直到它完成,然后离开。如果另一个调用进来,它不会启动一个新线程,除非它必须这样做。

我希望这可以解释我的问题。

4

1 回答 1

2

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

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

于 2012-04-09T21:00:05.480 回答