我想要并行处理一个集合,但是在实现过程中遇到了困难,因此希望能得到一些帮助。
问题出现在我想要在并行循环的 lambda 表达式中调用一个在 C# 中标记为 async 的方法时。例如:
问题出现在计数为0的情况下,因为所有创建的线程实际上只是后台线程,并且
问题出现在我想要在并行循环的 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的巧妙之处,我必须进行一些手动的异常处理..(为了简洁起见已删除)。
我如何在lambda中使用await关键字来实现Parallel.ForEach循环?这可能吗?
Parallel.ForEach方法的原型接受一个Action<T>作为参数,但我希望它等待我的异步lambda。
await GetData(item)
中删除await
,因为它会产生编译错误。 - Josh M.ConcurrentBag<T>
是一个非常专业化的集合类型。在这种情况下,使用ConcurrentQueue<T>
会更好。 - Theodor Zoulias