gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:00:49 26 4
gpt4 key购买 nike

我需要构建一个在 WCF 中监听新任务的进程。 (异步)每个任务都会(以某种方式)入队。

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

我想过:

while(true){
queue.Dequeue();
}

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

谢谢

最佳答案

看看System.Collections.Concurrent命名空间 - 有线程安全的队列实现即。 ConcurrentQueue - 虽然,我怀疑 BlockingCollection 会更好地满足您的需求.

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

while(true) 方法的优势在于避免了只会消耗 CPU 周期的紧密循环。除了线程安全之外,这还将解决排队和出队线程之间的同步问题。

编辑:

Blocking Collection 使用起来真的非常简单。请参阅下面的简单示例 - 添加任务将从您的 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);
}
});
}

在停止服务时,需要调用 _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-us/library/dd460684.aspx

关于C# - 始终运行和出队的队列管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9869245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com