Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC中实现TAP#_C#_Asp.net Mvc_Async Await - Fatal编程技术网

C# 在MVC中实现TAP#

C# 在MVC中实现TAP#,c#,asp.net-mvc,async-await,C#,Asp.net Mvc,Async Await,很抱歉问了一个一般性的问题,但我想就代码中可以启用TAP(任务异步编程)以获得更好性能的功能/区域提出建议 我还使用了一个WebAPI,在这里我可以使用AsyncWait从数据库中检索数据并执行CRUD操作 但是对于如何在MVC中实现TAP,我们有什么指导方针或具体方法吗 提前谢谢 很抱歉问了一个一般性的问题,但我想就代码中可以启用TAP(任务异步编程)以获得更好性能的功能/区域提出建议 让我们首先了解,什么是异步编程,它只是意味着在后台处理逻辑,而主线程处理继续进行,而不会被阻塞。在同步处理的

很抱歉问了一个一般性的问题,但我想就代码中可以启用TAP(任务异步编程)以获得更好性能的功能/区域提出建议

我还使用了一个WebAPI,在这里我可以使用AsyncWait从数据库中检索数据并执行CRUD操作

但是对于如何在MVC中实现TAP,我们有什么指导方针或具体方法吗

提前谢谢

很抱歉问了一个一般性的问题,但我想就代码中可以启用TAP(任务异步编程)以获得更好性能的功能/区域提出建议

让我们首先了解,什么是异步编程,它只是意味着在后台处理逻辑,而主线程处理继续进行,而不会被阻塞。在同步处理的情况下,会阻塞调用线程。异步处理有两种:

  • IO Async
    ,这是主要的使用案例,它适用于进程边界之外的任何调用,如对数据库或web服务/web api的调用,在这种情况下,基于硬件的并发性出现了,因为一旦通过网络调度调用,就不再需要软件线程,软件线程可以返回到线程池来处理其他请求,从而按照@Fabio的建议提高系统的可伸缩性或可用性。软件线程的作用是分派调用并接收结果,没有任何等待,在大多数情况下,假设没有内存逻辑,等待时间非常快<1毫秒。假设池中只有25个线程用于同步调用,它最多可以处理50-100个请求,因为等待管道会因长时间运行的请求(几秒钟)而膨胀,但对于异步处理,可以调度1000个请求,因为它们通过网络被调度以进行处理,不需要等待线程池线程分派
  • 内存异步
    ,这不是最常见的用例,但更多的是释放Ui线程,而逻辑内存处理可以在后台进行。它有助于保持界面的响应性。在这种情况下,Ui也可以响应,因为数据库调用是异步完成的,因为同步调用总是阻塞主线程,使系统无响应
  • 异步处理和并行处理之间有什么区别

    并行处理总是在内存中,用于利用所有计算能力并行处理逻辑元素(最好是互斥的),并最终聚合结果。它意味着利用所有的CPU处理能力。相比之下,异步处理是在后台处理,而不是阻塞主处理线程,内存中的异步(如果并行化)可能仍然使用CPU内核,但否则不会占用CPU内核

    我还使用了一个WebAPI,在这里我可以使用AsyncWait从数据库中检索数据并执行CRUD操作

    Web API通常托管在像IIS这样的Web服务器上,它具有有限的线程池,CRUD操作是应用程序边界之外的DB调用。如上所述,这是使用异步调用和提高系统可伸缩性的理想情况

    设计原则:

    可以列出几个主要细节:

  • 在C#
    async
    中,方法需要以
    await
    运算符作为前缀
  • 从入口到出口的完整链需要使用
    Async wait
    启用,如果我们在两者之间的任何地方错过了它,那么调用将变为非异步/阻塞,因为只有当通过网络调度IO调用和任何其他线程接管内存内调用时,实际线程才会被释放。像MVC和WebAPI这样的框架被启用,使得控制器(入口点)在默认情况下是异步的
  • 对于线程池线程,可以使用
    ConfigureAwait(false)
    来指示任何池线程接收结果,它不需要输入相同的同步上下文,这是默认的,Ui线程除外,Ui线程不能被任何其他线程替换(因为它是特殊的,并且只能呈现控件)
  • 结论


    同样的
    Async
    原则适用于所有框架,如
    MVC、WebAPI、WCF、
    ,因为同一框架可以同时进行
    Async
    Sync
    调用,异步调用的行为更像一个方面(横切),线程可以被引导到同步模式(阻塞)或异步模式(非阻塞)下工作,因此,增加系统的可伸缩性/可用性可以实现更好的性能-异步对性能没有帮助,但对可用性有帮助。请查看我的回答,这将有助于回答您可能遇到的大多数问题,如果您仍然有疑问,请回复