等待 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 请求的上下文中不会。
等待端点可用性的同步 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 请求的上下文中不会。