我尝试了下面的代码,直到长时间运行的方法完成后才会显示索引视图。如果我不使用异步和等待,那么在显示索引视图之前也需要相同的时间。现在,我想了解在 ASP.Net MVC 操作控制器中使用 async 和 wait 有什么好处?
public async Task<IActionResult> Index()
{
var result = await Task.Run(() => TestAsyncAndAwait());
ViewBag.ResultFromAwait = result;
return View();
}
public int TestAsyncAndAwait()
{
System.Threading.Thread.Sleep(1 * 60 * 1000);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了下面的代码
首先,您不想使用假异步代码进行测试。相反,测试同步方法与其真正的异步对应方法之间的差异:
public IActionResult Synchronous()
{
Thread.Sleep(1 * 60 * 1000);
ViewBag.ResultFromAwait = 1;
return View();
}
public async Task<IActionResult> Asynchronous()
{
await Task.Delay(1 * 60 * 1000);
ViewBag.ResultFromAwait = 1;
return View();
}
Run Code Online (Sandbox Code Playgroud)
在长时间运行的方法完成之前,不会显示索引视图。如果我不使用异步和等待,那么在显示索引视图之前也需要相同的时间。
HTTP 是一种请求/响应协议。客户端发送请求,一段时间后服务器发送响应。async不会改变 HTTP 协议的工作方式。
现在,我想了解在 ASP.Net MVC 操作控制器中使用 async 和 wait 有什么好处?
async并且await不会屈服于 HTTP 客户端(他们不能,因为他们不会更改 HTTP 协议)。相反,它们屈服于线程池。这使您的 ASP.NET 服务器能够处理更多的并发请求。
具体来说,对于同步示例(在问题和此答案中),ASP.NET 线程Sleep在整个分钟内被阻塞。但是,对于异步示例(在此答案中),没有使用 ASP.NET 线程来等待该分钟。相反,async/await允许该线程返回到 ASP.NET 线程池,当该分钟结束时,该线程池中的线程用于设置值ViewBag并返回View(). 因此,在这一整分钟的时间里,ASP.NET 服务器可以处理比其他情况下更多的请求,因为它有一个额外的可用线程。
问题中的假异步示例没有这种行为。它不是异步等待,而是阻塞线程池线程,因此它比同步解决方案效率较低且可扩展性较差。Task.Run这是ASP.NET 不鼓励的原因之一。
有关更多信息,请参阅这篇文章。
| 归档时间: |
|
| 查看次数: |
1434 次 |
| 最近记录: |