如何将Parallel.ForEach的结果发布到在C#中不断读取的队列中
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何将Parallel.ForEach的结果发布到在C#中不断读取的队列中,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2089字,纯文字阅读大概需要3分钟。
内容图文
![如何将Parallel.ForEach的结果发布到在C#中不断读取的队列中](/upload/InfoBanner/zyjiaocheng/803/4f1268df1e314e62a857644a4793d0e8.jpg)
在我的应用程序中,我有三个类,Extractor,Transformer和Loader,由第四类协调员协调.提取器,变压器和装载机非常简单,并执行以下操作:
抽出器
公开一个名为Results of IEnumerable< string>的成员,例如通过从文本文件中读取.提取应该是同步的.
变压器
公开一个名为Transform的成员,它接受一个字符串并通过某个过程将其转换为另一个字符串,这个过程预计很费时(在这里使用并行处理).
装载机
公开一个名为Load的成员,它接受一个字符串并将其加载到某个最终形式(例如另一个文本文件)中.加载应该是同步的.
协调员类协调三个操作.转换过程应该并行完成,然后将结果推送到加载程序读取的队列. Coordinator的Run()方法如下所示:
Extractor extractor = new Extractor();
Transformer transformer = new Transformer();
Loader loader = new Loader();
ConcurrentQueue<string> outputs = new ConcurrentQueue<string>();
Parallel.ForEach(extractor.Results, x => outputs.Enqueue(transformer.Transform(x)));
foreach(string output in outputs)
{
loader.Load(output);
}
这很好用,除了必须在任何加载完成之前完成ALL转换 – 即Parallel.ForEach()在下面的foreach开始之前完成.我希望每个输出在准备就绪后立即传递给加载器.
我也试过这个:
Extractor extractor = new Extractor();
Transformer transformer = new Transformer();
Loader loader = new Loader();
ConcurrentQueue<string> outputs = new ConcurrentQueue<string>();
foreach (string input in extractor.Results)
{
string input1 = input;
Task task = Task.Factory.StartNew(
() => outputs.Enqueue(transformer.Transform(input1)));
}
foreach(string output in outputs)
{
loader.Load(output);
}
但是在将任何输出添加到队列之前,底部的foreach循环会被击中,因此它就会退出.
一旦调用transform.Transform(),结果如何,我如何才能进行加载?
解决方法:
尝试BlockingCollection而不是Parallel.Invoke.在下面的示例中,GetConsumingEnumerable(生产者 – 消费者模式的消费者部分)将不会完成,直到调用CompleteAdding,因此加载将运行直到填充完成.
var outputs = new BlockingCollection<string>();
// aka Producer
Action fill = () => {
Parallel.ForEach(extractor.Results, x => outputs.Add(transformer.Transform(x)));
outputs.CompleteAdding();
};
// aka Consumer
Action load = () => {
foreach(var o in outputs.GetConsumingEnumerable())
loader.Load(o);
}
Parallel.Invoke(fill, load);
内容总结
以上是互联网集市为您收集整理的如何将Parallel.ForEach的结果发布到在C#中不断读取的队列中全部内容,希望文章能够帮你解决如何将Parallel.ForEach的结果发布到在C#中不断读取的队列中所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。