Asp.net mvc 异步MVC控制器

Asp.net mvc 异步MVC控制器,asp.net-mvc,asynchronous,controller,task-parallel-library,async-await,Asp.net Mvc,Asynchronous,Controller,Task Parallel Library,Async Await,我正在学习ASP.NET MVC中的AsyncController,并将其用于TPL,但我很难看到它的需求,我可以理解您何时希望异步运行一个操作以执行发送电子邮件之类的操作,但实际上您是否会使用它从一个操作返回一个视图 例如,如果操作从设置为异步工作的数据库中获取一些数据,然后返回一个视图,如果数据未能及时检索,视图是否会返回,而模型中没有数据 您是否会使用它从操作返回视图 ASP.NET中异步的主要优点是可伸缩性。当异步工作执行时,您不会消耗任何线程。这意味着您的应用程序将消耗更少的内存,而且

我正在学习ASP.NET MVC中的AsyncController,并将其用于TPL,但我很难看到它的需求,我可以理解您何时希望异步运行一个操作以执行发送电子邮件之类的操作,但实际上您是否会使用它从一个操作返回一个视图

例如,如果操作从设置为异步工作的数据库中获取一些数据,然后返回一个视图,如果数据未能及时检索,视图是否会返回,而模型中没有数据

您是否会使用它从操作返回视图

ASP.NET中异步的主要优点是可伸缩性。当异步工作执行时,您不会消耗任何线程。这意味着您的应用程序将消耗更少的内存,而且速度也可能更快

如果数据未能及时检索,视图是否会返回,而模型中没有数据

这取决于你以及你将如何准确地处理这一失败

您是否会使用它从操作返回视图

ASP.NET中异步的主要优点是可伸缩性。当异步工作执行时,您不会消耗任何线程。这意味着您的应用程序将消耗更少的内存,而且速度也可能更快

如果数据未能及时检索,视图是否会返回,而模型中没有数据


这取决于您以及您将如何准确地处理该故障。

异步控制器主要用于放弃当前线程池线程,以允许其他传入连接在您等待长时间运行的进程完成时进行处理

这与向后传递视图无关。从最终用户的角度来看,进程仍然会“阻塞”,但在服务器上,服务器响应传入请求所需的资源不会被消耗

默认情况下,IIS工作进程中每个cpu核心有250个线程池线程来响应传入的连接(这可以调整,但通常您应该知道自己在做什么)。如果您不得不让其他人等待长时间请求完成,那么在其中一个请求完成之前,其他人将无法连接到您的服务器。异步控制器解决了这个问题


在使用异步控制器时,您还可以将CPU绑定的工作卸载到专用线程,而在同步控制器中这更为困难。而且,它允许您并行执行任务。例如,假设您必须访问10个web站点并检索数据。大部分时间都花在等待这些web请求返回上,如果您执行异步操作,则可以并行执行这些请求。

异步控制器主要用于放弃当前线程池线程,以便在您等待长时间运行的进程完成时,允许其他传入连接进行处理

这与向后传递视图无关。从最终用户的角度来看,进程仍然会“阻塞”,但在服务器上,服务器响应传入请求所需的资源不会被消耗

默认情况下,IIS工作进程中每个cpu核心有250个线程池线程来响应传入的连接(这可以调整,但通常您应该知道自己在做什么)。如果您不得不让其他人等待长时间请求完成,那么在其中一个请求完成之前,其他人将无法连接到您的服务器。异步控制器解决了这个问题


在使用异步控制器时,您还可以将CPU绑定的工作卸载到专用线程,而在同步控制器中这更为困难。而且,它允许您并行执行任务。例如,假设您必须访问10个web站点并检索数据。大部分时间都花在等待这些web请求返回上,如果您是异步执行,则可以并行执行这些请求。

我相信.Net 1中每个CPU的线程池线程数过去是有限制的。目前,默认限制要高得多,大约一千个。而且,您似乎混淆了线程和进程。单个ASP.NET应用程序肯定会在单个进程中执行。而且使用async controller不会“将工作卸载到专用线程”,它会在正常的线程池线程上执行,就像往常一样。@svick-不确定这10个线程是从哪里来的。。默认池大小似乎是每个处理器250个线程。我认为10可能是旧的ThreadPool类大小。我关于卸载到非工作线程的评论写得不好,我会修改。@svick-我明白你关于线程和进程混淆的意思,我是指线程,不是进程,但现在已经更正。好的,你可以将工作卸载到另一个线程,但实际上不会给你任何东西。如果线程池的大小不够,请增加该大小。我认为在正常情况下,这是一个更好的解决方案。我相信在.NET1中,每个CPU有25个线程池线程的限制。目前,默认限制要高得多,大约一千个。而且,您似乎混淆了线程和进程。单个ASP.NET应用程序肯定会在单个进程中执行。而且使用async controller不会“将工作卸载到专用线程”,它会在正常的线程池线程上执行,就像往常一样。@svick-不确定这10个线程是从哪里来的。。默认池大小似乎是每个处理器250个线程。我认为10可能是旧的ThreadPool类大小。我关于卸载到非工作线程的评论写得不好,我会修改。@svick-我明白你关于线程和进程混淆的意思,我是指线程,不是进程,但现在已经更正。好的,你可以将工作卸载到另一个线程,但实际上不会给你任何东西。如果线程池的大小不够,请增加该大小。我认为在正常情况下,这是一个更好的解决方案。因此,对于第二个问题,从技术上讲,您不会真的希望使用异步控制器