带有异步Lambda的并行foreach

我想并行处理一个集合,但是在实现它时遇到了麻烦,因此希望获得一些帮助。

如果要在并行循环的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。

回答:

如果只需要简单的并行性,则可以执行以下操作:

var bag = new ConcurrentBag<object>();

var tasks = myCollection.Select(async item =>

{

// some pre stuff

var response = await GetData(item);

bag.Add(response);

// some post stuff

});

await Task.WhenAll(tasks);

var count = bag.Count;

如果您需要更复杂的内容,请查看Stephen

Toub的ForEachAsync文章。

以上是 带有异步Lambda的并行foreach 的全部内容, 来源链接: utcz.com/qa/416088.html

回到顶部