等待 Task.FromResult 的同步方法是否有意义

Does await a synchonous method with Task.FromResult make sense

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

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

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

从可用性的角度来看,它一点帮助也没有——您仍在通过 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 服务器/应用程序将简单地创建更多线程来处理请求,因此您甚至不会完全损害可用性——尽管开销更大;您可以使用异步代码处理更多的并发请求,并且这样做通常需要更少的内存。

My first mind was that makes no sense.

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

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

如果您无法控制上述方法,那么等待它就没有意义了。 Task.FromResult 只会用 TaskCompletionSource<T> 包装您的同步结果。幕后并没有本质上异步发生的事情。

Await 关键字的目的是与 Async 关键字一起使用以生成在丰富的 winForm 环境中异步运行的代码,从而使 UI 对处理 long 运行 方法,如果你的 Repo. GetCategories 需要几秒钟才能完成,但在 Web 请求的上下文中不会。