等待与Task.FromResult同步的方法是有道理的

时间:2015-08-11 08:47:33

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

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

我的第一个想法是没有意义的。但我不确定。

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

3 个答案:

答案 0 :(得分:4)

  

我的第一个想法是没有意义的。

你的思想是正确的。如果正在进行的操作不是异步的,为什么要将它包装在Task中呢?除非你重写了一个你无法控制的基类中声明的方法,否则这样会更好:

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

如果你无法控制所述方法,那么等待它就没有意义了。 Task.FromResult只会将您的同步结果包装为TaskCompletionSource<T>。幕后没有任何固有的异步发生。

答案 1 :(得分:0)

从可用性的角度来看,它没有任何帮助 - 您仍然可以通过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中),但如果您和{ #39;无论如何都在等待Get。但是,如果您使用手动延续或延迟等待,那将会有所不同。

最后,如果你有这么多的电话,网络服务器/应用程序将只是创建更多的线程来处理请求,所以你甚至不会严重损害可用性 - 但开销更大;您可以使用异步代码处理更多并发请求,并且通常需要更少的内存。

答案 2 :(得分:0)

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