我有一个异步方法,将在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 });
}
答案 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
中运行任务正文更好。