基本上我有一个我想要处理的静态自定义对象队列。在多个线程中,我需要启动一个单独的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();
}
}
如果它有所不同,我的自定义队列是一个基本上保存项目的队列,直到它们达到某个年龄,然后允许它们出列。每次触摸一个项目时,它的计时器再次启动。我知道这件作品很好。
我正在努力的部分是并行性。 (显然,我不知道我在这里做什么)。 我想要的是让一个线程处理队列直到它完成,然后消失。如果有另一个电话,除非必须,否则不会启动新线程。
我希望这可以解释我的问题。
答案 0 :(得分:2)
您可能需要考虑在此处使用BlockingCollection<T>
。您可以使自定义队列实现IProducerConsumerCollection
,在这种情况下BC可以直接使用它。
然后,您只需要启动一个长时间运行的任务来调用blockingCollection.GetConsumingEnumerable()
并处理foreach中的项目。当集合为空时,任务将自动阻止,并在新项目为Enqueued
时重新启动。