是否需要“返回等待Task.Run(()=> PartialView())”?

时间:2020-06-13 05:52:47

标签: c# async-await task

我对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());
}

2 个答案:

答案 0 :(得分:4)

我对c#中的异步和等待有所了解。

我建议阅读我的async introasync 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(),它会一直保留直到完成,然后转到下一个人的请求,然后再返回到上一个请求

非常重要的一点是,它只能与一个线程一起使用,而且您必须知道它与多线程是不同的