为什么返回Task <int>而不是int? (异步和等待)

时间:2016-09-05 13:10:29

标签: c# asynchronous async-await

让我说我跑RunSynchron()。在这种情况下,它运行Delay(),暂停10秒,然后继续执行程序。完成Delay()后,它会返回if - 语句的值1。但为什么我必须返回Task<int>而不是int

class Synchron
{
    public async void RunSynchron()
    {
        var delay = this.Delay();
        Console.WriteLine("Now we wait...");
        Console.WriteLine("But we can continue with our work");

        if(await delay == 1)
            Console.WriteLine("Now it's done");

    }

    public async Task<int> Delay()
    {
        await Task.Delay(10000);
        return 1;
    }
}

3 个答案:

答案 0 :(得分:0)

因为async关键字只是返回任务的方法的语法糖。这是它的定义。

在引擎盖下,当编译器在同一个方法调用上遇到await时,它将添加完整的异步调用并等待任务完成。因此,编译器需要Task<int>来为您构造代码,最终编译的代码。

请注意,await后面的代码被编码为从方法返回的任务的任务延续。如果你自己编写它,那里有很多样板文件。这就是async/await关键字如此有用的原因。

答案 1 :(得分:0)

因为函数不返回整数,而是一个Task以后再返回一个整数。如果函数返回一个整数,你可以像调用函数一样调用函数,但这比实际执行的代码更像是一种语法特性。

答案 2 :(得分:0)

async / await功能的设计是一个不幸的方面,async似乎是声明的一部分方法。

我说不幸是因为它是关于该方法的实现细节 - 具体来说,它改变了这种方法中可能出现的代码的性质,因此允许await s出现并将适当处理。

它不会更改方法的签名(事实上,它在接口声明中是不允许的)。因此,如果你有一个方法可以返回&#34;某些东西&#34;,并且在稍后的某个时间点返回&#34;某些东西&#34;可以转换为int,但您没有描述返回int的方法。在您的示例中,您将存储&#34;某些内容&#34;在您的delay变量中。那时它不是int - 只是稍后可以转换为int的内容。

他们可以选择async&#34;更多魔术&#34;通过让它隐式更改方法签名以将结果包装在Task中 - 但这会使实际返回类型对于临时检查不那么明显。如果想要将方法从async转换为非async或反之亦然(您还必须编辑返回类型),还需要更多实际编辑。

相关问题