- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要构建一个在 WCF 中监听新任务的进程。 (异步)每个任务都会(以某种方式)入队。
什么是循环队列和出队的最佳(逻辑和性能)方法。
我想过:
while(true){
queue.Dequeue();
}
我认为有更好的方法可以做到这一点。
谢谢
最佳答案
看看System.Collections.Concurrent命名空间 - 有线程安全的队列实现即。 ConcurrentQueue - 虽然,我怀疑 BlockingCollection 会更好地满足您的需求.
阻塞集合本质上是一种线程安全的集合,适用于生产者-消费者场景。在您的情况下,WCF 调用将充当将添加到集合中的生产者,而工作线程将充当消费者,本质上将从集合中获取排队的任务。通过使用单个消费者(和集合),您可以确保执行顺序。如果这不重要,那么您可以使用多个消费者线程。 (如果需要的话,还有 AddAny
和 TakeAny
静态重载允许您使用多个集合(多个队列)。)
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/
我的 JavaScript 代码中有一道数学题。我需要将给定数量的玩家随机分成 2 队,这样每次 - 如果玩家想再次比赛 - 团队都会重新组成,并且在形成所有组合之前他们应该不同。 假设我有 4 个玩
我是一名优秀的程序员,十分优秀!