9

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

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 });  
}
4

2 回答 2

7

回答晚了,但看起来您正在尝试并行执行 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
}
于 2014-01-06T17:33:09.257 回答
2

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

您可以将返回类型更改method2Taskwhich 将允许您等待操作结果,例如

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

您可以在循环中等待

method2().Wait();

虽然这样做并不比method2直接在你的 foreach 委托中运行任务主体更好。

于 2013-04-12T08:29:00.357 回答