首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步调用并行for循环

异步调用并行for循环
EN

Stack Overflow用户
提问于 2016-09-02 16:42:07
回答 1查看 54关注 0票数 2

我想做这样的事情:

代码语言:javascript
复制
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的ActionBlock,并逐个发布整数。缺点是,它没有像Parallel.For那样以智能的方式划分范围,并且每个迭代都一个一个地工作。
  4. 在Partitioner.Create中手动使用分区程序,但它不那么优雅。我想让框架为我做智能分区。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-03 12:48:26

您有一个常规的同步并行循环,您希望异步调用它(大概是为了将它从UI线程中移开)。

您可以用将任何其他CPU绑定的工作移出UI线程的方式进行:使用Task.Run

代码语言:javascript
复制
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“并行代码的异步包装器”)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39297214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档