我需要构建一个监听WCF新任务的过程。(异步)每个任务都会被排队(某种方式)。
最好的(逻辑和性能)方式是循环队列并将其出队。
我想过:
while(true){
queue.Dequeue();
}
我想应该有更好的方法来做这件事情。谢谢。
AddAny
和 TakeAny
静态重载,如果需要,可以使用多个集合(多个队列)。)while(true)
方法相比的优点是避免了仅会消耗 CPU 循环的紧密循环。除了具有线程安全性外,这也解决了排队和取消排队线程之间同步的问题。
编辑:StartConsumer
将在服务启动期间调用。public class MyTask { ... }
private BlockingCollection<MyTask> _tasks = new BlockingCollection<MyTask>();
private void AddTask(MyTask task)
{
_tasks.Add(task);
}
private void StartConsumer()
{
// I have used a task API but you can very well launch a new thread instead of task
Task.Factory.StartNew(() =>
{
while (!_tasks.IsCompleted)
{
var task = _tasks.Take();
ProcessTask(task);
}
});
}
_tasks.CompleteAdding
以使消费者线程中断。我会使用事件来同步队列,而不是无限循环。每当进行WCF调用时,将元素添加到队列中并发送“AnElementHasBeenAddedEvent”事件。
执行排队任务的线程侦听该事件,并在接收到它时清空队列。
确保只有一个线程执行此任务!
相比while(true)概念的优势:您不需要一个不断循环的线程,从而消耗资源。您只需尽可能少地工作。
Synchronized
方法,因为队列不是线程安全的:Queue.Synchronized(queue).Dequeue()
。 - MatthiasG