我想在for循环中执行某些操作并使用'await Task.Delay()'。 但我总是空着,它应该返回10。
public class Test {
public async Task<int> test() {
int sum=0;
for (int i = 0; i < 10; i++) {
System.Diagnostics.Debug.Write("start loop");
sum++;
await Task.Delay(1000);
System.Diagnostics.Debug.Write("finish loop");
}
return sum;
}
}
//主
Test test = new Test()
var test1 = test.test().Result;
答案 0 :(得分:0)
您的问题似乎是等待test().Result
导致死锁。原因是这一行
await Task.Delay(1000);
将执行流程返回给调用者,调用者然后调用test().Result
以等待任务完成。所以你的主线程就是阻塞。
上述行中的await
会在test
完成时尝试恢复Task.Delay()
的执行。但是默认情况下它会尝试在您的调用线程上恢复执行。是的,当前被阻止的线程,因为它等待Result
。
一种解决方案可能是将行改为:
await Task.Delay(1000).ConfigureAwait(false);
这会导致await
不再尝试在原始线程上恢复,而是继续尝试。这样你就可以避免死锁,你的程序应该继续。
答案 1 :(得分:0)
Await
确保当前异步方法中的其余代码在等待完成之后才会执行。
在控制台应用程序中,没有专门的SynchronizationContext;这意味着您的延续将在线程池线程上运行。Test
方法将控制权返回到Main
,只是继续执行。
var t = new Test();
t.test().Wait();
Console.WriteLine(t.test().Result);//output is 10