【发布时间】:2014-09-20 11:18:45
【问题描述】:
考虑这段代码,其中有一些工作在一个 for 循环中完成,然后是一个递归调用来处理子项。我想将 DoSomething(item) 和 GetItems(id) 转换为异步方法,但如果我在这里等待它们,for 循环将等待每次迭代完成后再继续,基本上失去了并行处理的好处。我怎样才能提高这种方法的性能?是否可以使用 async/await 来做到这一点?
public void DoWork(string id)
{
var items = GetItems(id); //takes time
if (items == null)
return;
Parallel.ForEach(items, item =>
{
DoSomething(item); //takes time
DoWork(item.subItemId);
});
}
【问题讨论】:
-
@ZombieSheep 我也问了另一个问题。两者是有区别的。另一个与递归有关,不讨论性能。这是一个 for 循环,我想知道如何在不等待的情况下让循环继续,同时在循环内执行异步操作。
-
我建议您通过弄清楚过程的哪一部分是问题所在,或者将这两个问题结合起来,以获得更高质量的答案。这样,给出的任何建议都会考虑到其余信息。
-
尽管它们是两个完全不同的问题——我不想把它们结合起来混淆讨论。另一个是关于 async/await 在递归方法中是否安全的问题。这是关于如何在循环中有效地使用 async/await。另一个根本与性能无关。
-
您在
DoSomething/DoWork中所做的工作确实是异步的吗?如果不是,那么通过使它们异步,您将一无所获。如果是的话,只需在一个线程中启动每个线程并等待所有线程,如果你必须并行 - 我仍然会坚持使用Parallel.ForEach
标签: c# .net asynchronous recursion async-await