C# - 始终运行和Dequeing的队列管理

Sex*_*yMF 3 c# queue

我需要构建一个在WCF中侦听新任务的进程.(异步)每个任务都得到入队(不知何故).

什么是循环队列和出列队列的最佳(逻辑和性能)方法.

我想过:

while(true){
   queue.Dequeue();
}
Run Code Online (Sandbox Code Playgroud)

我认为有更好的方法可以做到这一点.

谢谢

Vin*_*ayC 8

看看System.Collections.Concurrent命名空间 - 有线程安全的队列实现即.ConcurrentQueue - 尽管如此,我怀疑BlockingCollection可以更好地满足您的需求.

阻塞集合本质上是一个对生产者 - 消费者场景有用的线程安全集合.在您的情况下,WCF调用将充当将添加到集合的生成器,而工作线程将充当将基本上从集合中排队的任务的消费者.通过使用单个使用者(和集合),您可以确保执行顺序.如果这不重要,那么您可以使用多个消费者线程.(也有AddAnyTakeAny静态重载,将允许您使用多个集合(多队列),如果是这样的需要.)

while(true)方法更有优势的是避免仅消耗CPU周期的紧密循环.除了具有线程安全性之外,这还将解决排队和排队线程之间的同步问题.

编辑:

阻止收集真的很简单易用.请参阅下面的简单示例 - 将调用添加任务,说明您的WCF方法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);
        }
     });
}
Run Code Online (Sandbox Code Playgroud)

在停止服务时,需要调用_tasks.CompleteAdding以便消费者线程中断.

在MSDN上查找更多示例:

http://msdn.microsoft.com/en-us/library/dd997306.aspx
http://msdn.microsoft.com/en-us/library/dd460690.aspx
http://msdn.microsoft.com/en-我们/库/ dd460684.aspx