【发布时间】:2019-03-03 10:46:07
【问题描述】:
采取这个基本行动:
[HttpGet]
public IActionResult Index()
{
return View();
}
修改它以使用 async/await:
[HttpGet]
public async Task<IActionResult> Index()
{
return await Task.Run(() => View());
}
我很困惑这是否会改进我的代码。根据我的理解,await 关键字会释放调用线程,以便它可以在其他地方使用,这样可以更好地利用可用线程。
但除了返回视图的这一件事之外,我实际上并没有做任何其他事情。使用 async 关键字实际上在编译代码中引入了一个状态机,这增加了复杂性。
让这个动作异步值得吗?有没有更好的方法来修改它以使其异步?
【问题讨论】:
-
您还没有真正将控制器修改为异步的。无论如何,所有请求都由单独的线程处理。
async/await旨在避免在执行 IO 工作时阻塞这些线程。如果您使用await Task.Run(),您只需使用一个新任务/线程来完成原始线程可以轻松完成的工作 -
await Task.Run()几乎总是错误的。 -Task.Run()- “TPL,请在我忙于做其他事情时找到一个线程来运行此代码”。await- “我在 this 线程上没有有用的工作要做 - 去看看有没有其他东西可以利用它” -
@Damien_The_Unbeliever 只有在 ASP 上下文中才真正如此。确实如此,但您的陈述暗示它适用于其他情况,但它非常不正确。
-
@Servy - 在 asp 上下文中确实如此。在控制台上下文中确实如此。如果它正在运行其他经常
await本身并且不会占用CPU的代码,那么在具有“祝福线程”(例如UI线程)的上下文中可能是正确的。如果您试图从 UI 线程中推出受 CPU 限制的工作,则不是这样。但我不经常看到它在那种情况下使用。 -
这是一个人为的问题。当您需要数据来填充模型时,它会发生变化。当你有一些元素在做异步 I/O 时,使 Action 异步是有利可图的。
标签: c# .net asp.net-mvc asynchronous async-await