有什么好处等待同步repo.GetCategories调用端点的可用性?
我的第一个想法是没有意义的。但我不确定。
[HttpGet]
public async Task<IHttpActionResult> Get(string country)
{
var result = repo.GetCategories(new List<string> { country});
return await Task.FromResult(Ok(result));
}
答案 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请求的上下文中完成。