异步调用并行的for循环
本文关键字:for 循环 并行 调用 异步 | 更新日期: 2023-09-27 18:05:37
我想这样做:
public async Task MyMethod()
{
// Do some preparation
await Parallel.ForEachAsync(0, count, i => { // Do some work //});
// do some finalization
}
然而,我没有找到一种优雅的方式来做到这一点。我想到了两种方法,但它们都不是最优的:
- 我唯一想到的是手动分区范围,创建任务,然后使用Task.WhenAll。
- 使用以下代码
Task.Factory.StartNew(() => Parallel.For(...));
.
问题是它在异步任务上"浪费"了一个线程。 - 使用TPL Dataflow的ActionBlock,并一个接一个地发布整数。缺点是它不能像Parallel那样聪明地划分范围。For在每次迭代中一个接一个地工作。
- 手动使用分区器和分区器。创造,却不那么优雅。我想让框架为我做智能分区。
你有一个常规的同步并行循环,你想异步调用(大概是把它从UI线程移开)。
你可以这样做,你可以把任何其他cpu绑定的工作从UI线程:使用Task.Run
:
public async Task MyMethod()
{
// Do some preparation
await Task.Run(() => Parallel.ForEach(0, count, i => { /* Do some work */ }));
// do some finalization
}
没有线程"浪费",因为Parallel.ForEach
将使用调用线程作为其工作线程之一。
(这是我的书中的配方7.4"并行代码的异步包装器")。