c# – ConcurrentQueue .Net:多线程消费者
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – ConcurrentQueue .Net:多线程消费者,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2315字,纯文字阅读大概需要4分钟。
内容图文
![c# – ConcurrentQueue .Net:多线程消费者](/upload/InfoBanner/zyjiaocheng/805/d2b0399336e44ac4afe36ae127bacc74.jpg)
我有一个非常基本的问题,更多的是关于ConcurrentQueue的概念.队列是FIFO.当多个线程开始访问它时,我们如何保证FIFO?
假设,我按顺序添加了Apple,Oranges,Lemon,Peach和Apricot.第一个TryTake应该返回Apple.但是当多个线程开始提供自己的TryTake请求时会发生什么?难道有可能当一个线程甚至在另一个线程可以返回Apple之前返回Lemon时?我假设其他项目也将被返回,直到队列为空.但这些回报是否会围绕FIFO的基本原则进行管理?
解决方法:
ConcurrentQueue本身的行为始终是FIFO.
当我们谈论来自ConcurrentQueue的线程“返回”项时,我们讨论的是一个涉及将项目队列化并执行某种操作的操作,该操作使您能够观察已经出列的内容.无论是打印输出还是将该项添加到另一个列表,在检查之前,您实际上并不知道哪个项已从队列中取出.
虽然队列本身是FIFO,但您无法预测其他事件(例如检查出列项目)将发生的顺序.这些项目将出列队列FIFO,但您可能会或可能无法按顺序观察队列中出现的内容.不同的线程可能不会以与从队列中删除项目完全相同的顺序执行该检查或输出.
换句话说,它将发生FIFO但它可能或可能不总是看起来像它.如果处理项目的确切顺序至关重要,您不希望同时从ConcurrentQueue读取.
如果你要对此进行测试(我即将写一些东西),那么你可能会在大多数情况下找到以精确的FIFO顺序处理的项目,但之后每隔一段时间他们就不会.
这是一个控制台应用程序.它会
>在ConcurrentQueue中插入1-5000的数字,单线程.
>执行并发操作以使每个项目出列并将它们移动到另一个ConcurrentQueue.这是“多线程消费者”.
>读取第二个队列中的项目(再次单线程)并报告任何不按顺序的数字.
很多时候我运行它并没有任何不按顺序.但是大约有50%的时间只报告了几个数字.因此,如果您指望按原始序列处理所有数字,那么大多数情况下几乎所有数字都会发生.但那不会.如果你不关心确切的顺序,那就没关系了,但是如果你这样做的话,那就是错误和不可预测的.
结论 – 不依赖于多线程操作的确切顺序.
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading.Tasks;
namespace ConcurrentQueueExperiment
{
class Program
{
static void Main(string[] args)
{
var inputQueue = new ConcurrentQueue<int>();
var outputQueue = new ConcurrentQueue<int>();
Enumerable.Range(1,5000).ToList().ForEach(inputQueue.Enqueue);
while (inputQueue.Any())
{
Task.Factory.StartNew(() =>
{
int dequeued;
if (inputQueue.TryDequeue(out dequeued))
{
outputQueue.Enqueue(dequeued);
}
});
}
int output = 0;
var previous = 0;
while (outputQueue.TryDequeue(out output))
{
if(output!=previous+1)
Console.WriteLine("Out of sequence: {0}, {1}", previous, output);
previous = output;
}
Console.WriteLine("Done!");
Console.ReadLine();
}
}
}
内容总结
以上是互联网集市为您收集整理的c# – ConcurrentQueue .Net:多线程消费者全部内容,希望文章能够帮你解决c# – ConcurrentQueue .Net:多线程消费者所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。