【问题标题】:Async method - difference between await and returning a Task [duplicate]异步方法-等待和返回任务之间的区别[重复]
【发布时间】:2017-01-03 09:41:48
【问题描述】:

这两种方法有什么实际区别(如果有的话)?

    public static Task DoSomething()
    {
        return FooAsync();
    }

    public static async Task DoSomethingAsync()
    {
        await FooAsync();
    }

【问题讨论】:

  • 将其标记为重复的人是错误的。 OP 不是询问是否使用其中一个,而是询问有什么区别,并且答案与链接问题中的答案有很大不同。

标签: c# asynchronous


【解决方案1】:

在使用这些方面的实际区别是:没有。两者都是“等待的”。

生成的代码会有一点点不同,异步版本会变成状态机。真的没什么好担心的。

由于这些方法无济于事,因此很难选择其中一种。第一个(最简单的)就可以了。

【讨论】:

    【解决方案2】:

    await 实际上会等待任务完成并返回结果。当您返回一个任务时,它会返回一个将在未来完成的任务的句柄,因此您等待任务以获取结果。

    【讨论】:

    • 使用await的方法无论如何都会返回一个任务,所以你仍然必须等待它们
    • await 不等待 FooAsync() 完成,它立即返回给调用者(如果FooAsync() 返回的Task 尚未完成) .当内部任务完成时,DoSomethingAsync() 最终将在await 之后恢复...所以没有区别,因为没有什么可以恢复...只是编译器开销。
    • 是的,我同意它放弃控制,但它 await 会让它等待结果。我并不是说 await 会使其同步,使其成为阻塞调用。
    【解决方案3】:

    DoSomething() 将在调用者询问时执行。 所以它会在你执行await DoSomething(); 时执行。但是您可以将任务存储在变量中并稍后执行:

    var task = DoSomething();
    // Do stuff
    await task();
    

    使用DoSomethingAsync,调用时会执行。因为它是异步的。

    【讨论】:

    • 是的,一个是异步的。但是两者都有“延迟执行”,在何时或如何调用 FooAsync() 方面绝对没有区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多