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

标签 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;
    }
}

最佳答案

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

在底层,当编译器遇到 await 时在同一个方法调用上,它会添加完整的异步调用和等待任务完成。因此,编译器需要 Task<int>为您构建代码,最终编译的代码。

注意 await 后面的代码被编码为从该方法返回的任务的任务延续。如果您尝试自己编写,则会有很多样板文件。这就是为什么 async/await关键字非常有用。

关于c# - 为什么返回 Task<int> 而不是 int? (异步和等待),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39331343/

相关文章:

c# - 如何链接调用,使用响应作为另一个调用的输入

c# - 说丢弃任务的非异步方法位于异步等待链的 "top"是否正确?

c# - 如何使用azure sql进行多接口(interface)框架

c# - 如何动态添加 HTML 元素 (ASP.NET)

C# 检测调用是否在同一个 UI 操作中

java - 异步方法调用完成后,Spring 命令行应用程序挂起

rust - 当结构具有异步方法时,如何指定Rust结构字段必须满足特征?

c# - 如何设置基于参数值动态返回结果的模拟?

c# - 具有异步表单工厂的简单注入(inject)器

javascript - Javascript 回调的处理方式有何不同?