2016-12-30 256 views
-4

我想在for循环中执行一些操作并使用'await Task.Delay()'。 但我总是空的,它应该返回10为什么异步任务<TResult>总是返回空值

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

您在检查/打印值之前是否等待它? – FCin

+3

什么是空的?我不明白。你的意思是它返回零吗?另外,它将如何达到55,数学不会加起来。 –

+3

请说明你是怎么称呼这个的,我猜你不会等待任务完成。加上你的代码的预期结果是10,而不是55.如果你想55'sum ++;'改变为'sum + = i;' –

回答

0

您的问题似乎是在等待test().Result导致死锁。原因是,这条线

await Task.Delay(1000); 

返回执行流程给调用者,然后调用test().Result等待完成任务。所以你的主线程阻塞。

上述行中的await尝试在Task.Delay()完成时恢复执行test。但是默认情况下,它会尝试在您的调用线程上恢复执行。是的,当前被阻止的线程,因为它等待Result

一种解决方案可能更改行:

await Task.Delay(1000).ConfigureAwait(false); 

这将导致await不再尝试恢复原线,但任何其他的。这样你可以避免死锁,你的程序应该继续。

+0

谢谢!但这意味着我需要为每个Task.Delay添加'ConfigureAwait(false)',对吧? – LittleTin

+0

@LittleTin我想细节取决于你的真实代码。我想这足以将它追加到'test()'中的第一个'await'ed调用,因为之后你已经在另一个线程中了。 –

0

Await确保当前异步方法中的其余代码在等待完成后才执行。 在控制台应用程序中,没有专门的SynchronizationContext;这意味着您的延续将在线程池线程上运行。Test方法将控制权返回到Main,它只会继续执行。

 var t = new Test(); 
     t.test().Wait(); 
     Console.WriteLine(t.test().Result);//output is 10 
相关问题