我想并行处理一个集合,但是在实现它时遇到了麻烦,因此希望获得一些帮助。
如果要在并行循环的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;
它可以工作,但是它完全禁用了等待的灵巧性,我必须执行一些手动的异常处理。(为简洁起见,已删除)。
如何实现Parallel.ForEach
在lambda中使用await关键字的循环?可能吗?
Parallel.ForEach方法的原型采用Action<T>
as作为参数,但我希望它等待我的异步lambda。
await
从await GetData(item)
第二个代码块中删除,因为这将按原样产生编译错误。