异步调用并行的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
}

然而,我没有找到一种优雅的方式来做到这一点。我想到了两种方法,但它们都不是最优的:

  1. 我唯一想到的是手动分区范围,创建任务,然后使用Task.WhenAll。
  2. 使用以下代码Task.Factory.StartNew(() => Parallel.For(...)); .
    问题是它在异步任务上"浪费"了一个线程。
  3. 使用TPL Dataflow的ActionBlock,并一个接一个地发布整数。缺点是它不能像Parallel那样聪明地划分范围。For在每次迭代中一个接一个地工作。
  4. 手动使用分区器和分区器。创造,却不那么优雅。我想让框架为我做智能分区。

异步调用并行的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"并行代码的异步包装器")。