【发布时间】:2013-02-14 16:52:52
【问题描述】:
我想并行处理一个集合,但我在实现它时遇到了麻烦,因此我希望得到一些帮助。
如果我想在并行循环的 lambda 中调用 C# 中标记为 async 的方法,就会出现问题。例如:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
}
var count = bag.Count;
计数为 0 时会出现问题,因为创建的所有线程实际上只是后台线程,Parallel.ForEach 调用不会等待完成。如果我删除 async 关键字,方法如下所示:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
// some pre stuff
var responseTask = await GetData(item);
responseTask.Wait();
var response = responseTask.Result;
bag.Add(response);
// some post stuff
}
var count = bag.Count;
它可以工作,但它完全禁用了 await 聪明,我必须做一些手动异常处理..(为简洁起见已删除)。
如何实现Parallel.ForEach 循环,它在 lambda 中使用 await 关键字?有可能吗?
Parallel.ForEach 方法的原型采用 Action<T> 作为参数,但我希望它等待我的异步 lambda。
【问题讨论】:
-
我假设您打算在第二个代码块中从
await GetData(item)中删除await,因为它会按原样产生编译错误。 -
附带说明,
ConcurrentBag<T>是一个very specialized 集合。在这种情况下,ConcurrentQueue<T>会更好地为您服务。
标签: c# async-await task-parallel-library parallel.foreach