在Parallel.foreach中等待

时间:2013-04-12 08:12:06

标签: c# async-await task-parallel-library parallel.foreach

我有一个异步方法,将在Parallel.Foreach中使用。在异步方法中有等待任务。 但是,在测试中,似乎没有等待行为,await Task没有完成。有什么问题?以下是代码。

public void method1()
{
  Ilist<string> testList = new IList<string>(){"1","2","3"};
  Parallel.ForEach(testList, ()=>
  {
       method2();
  });
}
public async void method2()
{
   await Task.run(()=>{  some other codes here });  
}

2 个答案:

答案 0 :(得分:6)

最近回答,但看起来你正在尝试并行执行CPU绑定工作,而不是异步执行I / O绑定工作。 Parallel.ForEach正在处理您的并行性,因此不需要Task.Run,​​而async / await在这里没有任何帮助。我建议从method2中删除这些位,所以整个过程简化为:

public void method1()
{
    Ilist<string> testList = new IList<string>(){"1","2","3"};
    Parallel.ForEach(testList, ()=>
    {
        method2();
    });
}
public void method2()
{
    // some other (plain old synchronous) code here
}

答案 1 :(得分:2)

void async方法是“一劳永逸”,没有办法等待它们完成。在并行循环中调用method2时,它会立即返回,因此您的循环仅确保在循环完成之前创建method2中的任务。

您可以将method2的返回类型更改为Task,这样您就可以等待操作的结果,例如

public async Task method()
{
     await Task.Run(() { some other code here });
}

你可以在循环中等待

method2().Wait();

虽然这样做并不比直接在你的foreach代表中method2中运行任务正文更好。