为什么async Task <tresult>总是返回空值

时间:2016-12-30 18:07:28

标签: c#

我想在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;

2 个答案:

答案 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