使用async关键字返回视图

时间:2017-07-21 01:51:32

标签: asp.net-mvc asp.net-mvc-4

有一些代码示例,我在其中显示了一些代码,如下所示。

 public async Task<IActionResult> AddUser(User user)
 {
      ///Logic to add user
      return View();
 }

使用异步操作结果方法返回视图是一种很好的做法,因为它自身不支持异步。

我在正常情况下检查过它的工作原理非常好但是它可能会失败或产生问题的场景是什么。

1 个答案:

答案 0 :(得分:6)

使用asyncawait是一种很好的做法,可以使您的Web应用程序可扩展,MSDN说(如果我没记错的话:))。基本上,它有助于利用您的线程池,以便1个线程不一定被分配来处理仅1 请求。假设你有这个动作:

 public async Task<IActionResult> AddUser(User user)
 {
      ///Logic to add user
      return await Task.Run(() => View());
 }

据说在等待异步方法完成时,该线程可用于在.NET运行时线程中为另一个工作项(例如标记为async的另一个操作)分配 - 池全局队列。这使得线程数可以少于需要处理的请求数。

async修饰符被标记为告诉.NET运行时这是一个可以应用上述机制的工作项。如果没有await某些内容,它在性能或资源优化方面没有多大帮助(如果我们不想说&#34;没有&#34;)。

为了证明概念,我在HomeController

中使用了以下操作
    public async Task<ActionResult> FineGrained()
    {
        return await Task.Run(() => {
            return Json(Thread.CurrentThread.ManagedThreadId, JsonRequestBehavior.AllowGet);
        });
    }

    public async Task<ActionResult> CoarseGrained()
    {
        return await Task.Run(async () => {
            await Task.Delay(TimeSpan.FromSeconds(5));
            return Json(Thread.CurrentThread.ManagedThreadId, JsonRequestBehavior.AllowGet);
        });
    }

这是测试线程利用率的jquery脚本:

        $.when(
            $.getJSON('/Home/FineGrained'),
            $.getJSON('/Home/CoarseGrained'),
            $.getJSON('/Home/FineGrained'),
            $.getJSON('/Home/FineGrained'),
            $.getJSON('/Home/FineGrained')
        ).done(function (v1, v2, v3, v4, v5) {
            console.log(v1[0]);
            console.log(v2[0]);
            console.log(v3[0]);
            console.log(v4[0]);
            console.log(v5[0]);
        });

我得到的许多结果之一: 三十 25 三十 三十 25

我多次刷新包含测试脚本的页面,并始终获得重复的线程ID。这足以证明这一理论。