c# – Task.StartNew Parallel.ForEach没有等待
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Task.StartNew Parallel.ForEach没有等待,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1648字,纯文字阅读大概需要3分钟。
内容图文
![c# – Task.StartNew Parallel.ForEach没有等待](/upload/InfoBanner/zyjiaocheng/810/b975a3f37f404335b20b832ac1fbf4ad.jpg)
我有这个代码:
await Task.Factory.StartNew(
() => Parallel.ForEach(
urls,
new ParallelOptions { MaxDegreeOfParallelism = 2 },
async url =>
{
Uri uri = new Uri(url);
string filename = System.IO.Path.GetFileName(uri.LocalPath);
using (HttpClient client = new HttpClient())
using (HttpResponseMessage response = await client.GetAsync(url))
using (HttpContent content = response.Content)
{
// ... Read the string.
using (var fileStream = new FileStream(config.M_F_P + filename, FileMode.Create, FileAccess.Write))
{
await content.CopyToAsync(fileStream);
}
}
}));
MessageBox.Show("Completed");
它应该处理超过800个元素的列表,但它不等待下载和文件写入完成.
事实上,他开始下载和写作,显示消息,然后在后台继续下载…
我需要以并行和异步方式下载大量文件,但我必须等待所有文件都下载.这段代码出了什么问题?
解决方法:
Parallel.ForEach不适用于异步.它期望一个Action但是为了等待异步方法它需要得到一个Func< Task>.
你可以使用TPL Dataflow的ActionBlock来代替异步构建.你给它一个委托(异或非)来对每个项目执行.您可以配置块的并行性(如果需要,还可以配置有界容量).并将您的商品发布到其中:
var block = new ActionBlock<string>(async url =>
{
Uri uri = new Uri(url);
string filename = System.IO.Path.GetFileName(uri.LocalPath);
using (HttpClient client = new HttpClient())
using (HttpResponseMessage response = await client.GetAsync(url))
using (HttpContent content = response.Content)
{
// ... Read the string.
using (var fileStream = new FileStream(config.M_F_P + filename, FileMode.Create, FileAccess.Write))
{
await content.CopyToAsync(fileStream);
}
}
}, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 } );
foreach (var url in urls)
{
block.Post(url);
}
block.Complete();
await block.Completion;
// done
内容总结
以上是互联网集市为您收集整理的c# – Task.StartNew Parallel.ForEach没有等待全部内容,希望文章能够帮你解决c# – Task.StartNew Parallel.ForEach没有等待所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。