【问题标题】:Does await a synchonous method with Task.FromResult make sense使用 Task.FromResult 等待同步方法是否有意义
【发布时间】:2015-08-11 08:47:33
【问题描述】:

等待同步 repo.GetCategories 调用对端点的可用性有什么好处?

我的第一个想法是这毫无意义。但我不确定。

[HttpGet]
public async Task<IHttpActionResult> Get(string country)
{
    var result = repo.GetCategories(new List<string> { country});
    return await Task.FromResult(Ok(result));
}

【问题讨论】:

    标签: c# asp.net-web-api async-await asp.net-web-api2


    【解决方案1】:

    我的第一个想法是这毫无意义。

    你的想法是对的。如果正在进行的操作不是异步的,为什么还要将其包装在 Task 中?除非您要覆盖在您无法控制的基类中声明的方法,否则这样会更好:

    [HttpGet]
    public IHttpActionResult Get(string country)
    {
        var result = repo.GetCategories(new List<string> { country});
        return Ok(result);
    }
    

    如果您无法控制上述方法,那么等待它是没有意义的。 Task.FromResult 只会用TaskCompletionSource&lt;T&gt; 包装您的同步结果。幕后没有任何内在的异步发生。

    【讨论】:

    • @Luaan 不,没有这个必要。
    【解决方案2】:

    从可用性的角度来看,它没有一点帮助 - 您仍然通过 GetCategories 调用阻塞线程。您会从使用中获得等效的行为

    [HttpGet]
    public async Task<IHttpActionResult> Get(string country)
    {
        var result = repo.GetCategories(new List<string> { country });
        return Ok(result);
    }
    

    [HttpGet]
    public Task<IHttpActionResult> Get(string country)
    {
        var result = repo.GetCategories(new List<string> { country });
        return Task.FromResult(Ok(result));
    }
    

    它们的工作方式相同,只是处理异常的方式不同(在async+await 的情况下,它们总是包裹在Task 中),但是如果您正在等待Get,这并不重要.不过,如果您使用手动延续或延迟等待,那将会有所不同。

    最后,如果您有大量这样的调用,Web 服务器/应用程序将简单地创建更多线程来处理请求,因此您甚至不会完全损害可用性 - 但是开销更大;您可以使用异步代码处理更多的并发请求,而且这样做通常会占用更少的内存。

    【讨论】:

      【解决方案3】:

      Await 关键字的目的是与 Async 关键字一起使用以生成在丰富的 winForm 环境中异步运行的代码以使 UI 在处理长时间运行的方法时更具响应性,这是没有意义的,如果您的 Repo . GetCategories 需要几秒钟才能完成,但在此 Web 请求上下文中不会。

      【讨论】:

      • 这只是await 有用性的一小部分。在任何情况下,它都不会使 UI 响应,因为这里的“异步”方法没有任何异步 - 它将完全同步完成,阻塞调用线程。
      • 这就是我想要表达的观点,我不知道阻塞部分,但感谢您提供的信息,我会尝试清理我的回复以更清楚
      猜你喜欢
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 2018-12-19
      相关资源
      最近更新 更多