我对c#中的异步和等待有所了解。但是我看到了这种返回视图的方法,如图所示。所以我想知道这种方法如何工作?
我已经做到了
public async Task<PartialViewResult> SamplePartialPage()
{
ViewBag.countryList = await db.CountryList.ToListAsync();
return PartialView();
}
但不是这个。
public async Task<PartialViewResult> SamplePartialPage()
{
ViewBag.countryList = await db.CountryList.ToListAsync();
return await Task.Run(() => PartialView());
}
答案 0 :(得分:4)
我对c#中的异步和等待有所了解。
我建议阅读我的async intro和async best practices。还有很多其他很棒的资源。由于您使用的是ASP.NET,因此您还应该阅读async on ASP.NET。
我想知道为什么有些人会使用第二种行为?
在ASP.NET上,没有充分的理由使用cleanupSpec()
。 await Task.Run
将工作调度到线程池线程并释放当前线程。但是在ASP.NET上,代码已经在线程池线程上运行,因此await Task.Run
仅导致线程切换,根本没有任何好处。
在其他情况下,此 是有效模式;具体来说,如果您使用的是客户端GUI应用程序中的UI线程,则使用await Task.Run
是一种正常的模式,可以将工作推离UI线程并保持响应状态。
答案 1 :(得分:-2)
Await是专门为处理耗时的事务而设计的,传统方法是在I / O请求完成后通过回调完成的
例如,当一个人呼叫SamplePartialPage()
并且命令行到达
await DB.CountryList.ToListAsync()
,它会一直保留直到完成,然后转到下一个人的请求,然后再返回到上一个请求
非常重要的一点是,它只能与一个线程一起使用,而且您必须知道它与多线程是不同的