C# 我应该在ASP.NET MVC中何时使用异步控制器?

C# 我应该在ASP.NET MVC中何时使用异步控制器?,c#,asp.net,asp.net-mvc-4,asynchronous,async-await,C#,Asp.net,Asp.net Mvc 4,Asynchronous,Async Await,我对在ASP.NET MVC中使用异步操作有些担心。它什么时候能提高我的应用程序的性能,什么时候不能 在ASP.NET MVC中到处使用异步操作好吗 关于等待方法:当我想查询数据库(通过EF/NHibernate/other ORM)时,我应该使用async/await关键字吗 我可以使用wait关键字在一个操作方法中异步查询数据库多少次 async当操作对DB或某些网络绑定调用执行某些I\O操作时,操作的帮助最大,其中处理请求的线程将在从您刚才调用的DB或网络绑定调用获得响应之前暂停。最好与它

我对在ASP.NET MVC中使用异步操作有些担心。它什么时候能提高我的应用程序的性能,什么时候不能

  • 在ASP.NET MVC中到处使用异步操作好吗
  • 关于等待方法:当我想查询数据库(通过EF/NHibernate/other ORM)时,我应该使用async/await关键字吗
  • 我可以使用wait关键字在一个操作方法中异步查询数据库多少次

  • async
    当操作对DB或某些网络绑定调用执行某些I\O操作时,操作的帮助最大,其中处理请求的线程将在从您刚才调用的DB或网络绑定调用获得响应之前暂停。最好与它们一起使用wait,它将真正提高应用程序的响应能力(因为在等待DB或任何其他类似操作时,较少的ASP输入/输出线程将被暂停)。在我所有的应用程序中,每当有许多对DB的调用非常必要时,我总是将它们包装在awiatable方法中,并使用
    wait
    关键字调用它们。

    当一个操作必须执行多个独立的长时间运行操作时,异步操作方法非常有用

    AsyncController类的典型用途是长时间运行的Web 服务电话

    我的数据库调用应该是异步的吗

    IIS线程池通常可以处理比数据库服务器多得多的同时阻塞请求。如果数据库是瓶颈,异步调用将不会加快数据库响应。在没有节流机制的情况下,通过使用异步调用将更多的工作高效地分配给超负荷的数据库服务器只会将更多的负担转移到数据库上。如果数据库是瓶颈,那么异步调用就不是灵丹妙药

    应该看一看和参考资料

    源自@PanagiotisKanavos注释:


    此外,异步并不意味着并行。异步执行可以释放 有价值的线程池线程阻止外部资源,例如 没有复杂性或性能成本。这意味着同一台IIS计算机可以 处理更多并发请求,并不是说它会运行得更快


    您也应该考虑阻塞呼叫以 CPU密集型等待。在压力时期,阻止通话将 导致延迟升级和应用程序池回收。异步调用 简单地避免这种情况

    在ASP.NET MVC中到处使用异步操作好吗

    在编程中,这要视情况而定。当走上一条特定的道路时,总会有一个权衡

    async await
    在您知道将收到对服务的并发请求并且希望能够很好地扩展的地方大放异彩。
    async wait
    如何帮助扩展?事实上,当您同步调用异步IO调用(例如网络调用或命中数据库)时,负责执行的当前线程将被阻塞,等待请求完成。当您使用
    asyncwait
    时,您可以启用框架为您创建一个状态机,以确保在IO调用完成后,您的方法从停止的位置继续执行

    需要注意的是,这个状态机有一个微妙的开销。使方法异步并不能使其执行更快,这是一个需要理解的重要因素,也是许多人的误解

    使用
    asyncwait
    时需要考虑的另一件事是,它始终是异步的,这意味着您将看到异步贯穿整个调用堆栈,自上而下。这意味着,如果您想公开同步API,您经常会发现自己复制了一定数量的代码,而且混合得不好

    当我想查询数据库时,我应该使用async/await关键字吗(通过 EF/NHibernate/其他ORM)

    如果您选择使用异步IO调用,那么是的,
    async wait
    将是一个不错的选择,因为越来越多的现代数据库提供程序公开了实现TAP(任务异步模式)的异步方法

    我可以使用wait关键字查询数据库多少次 在一个单一操作方法中异步


    只要遵循数据库提供程序规定的规则,就可以使用任意数量的数据库。您可以进行的异步调用数量没有限制。如果您有相互独立且可以同时执行的查询,您可以为每个查询旋转一个新任务,并使用
    等待任务。当所有的
    等待这两个任务完成时。

    正如您所知,MVC支持异步控制器,您应该利用它。如果您的控制器执行长时间的操作(可能是基于磁盘的I/o或对另一个远程服务的网络调用),则如果以同步方式处理请求,IIS线程将一直处于繁忙状态。因此,线程只是在等待漫长的操作完成。当第一个请求的操作正在进行时,通过服务其他请求可以更好地利用它。这将有助于服务更多并发请求。 您的Web服务将具有高度的可扩展性,并且不会轻易运行到。 对于db查询,最好使用async/await。是的,你可以在你认为合适的时候多次使用它们

    寻找优秀的建议。

    你可以找到我的建议;我在那篇文章中花了很多篇幅来描述什么时候应该在ASP.NET上使用
    async
    ,而不仅仅是如何在ASP.NET上使用
    async

    我对在ASP.NET MVC中使用异步操作有些担心。当它提高我的应用程序的性能时,以及当-不

    首先,要理解
    async
    /
    await
    就是释放线程。在GUI应用程序上,主要是释放GUI线程,以便用户体验更好。在服务器上
    Task task1 = FooAsync(); // launch it, but don't wait for result
    Task task2 = BarAsync(); // launch bar; now both foo and bar are running
    await Task.WhenAll(task1, task2); // this is better in regard to exception handling
    // use task1.Result, task2.Result
    
    .ToListAsync()
    .FirstOrDefaultAsync()
    .SaveChangesAsync()
    .FindAsync()