Red de conocimientos turísticos - Información de alquiler - ¿Por qué mvc4 asynccontroller no se puede ejecutar de forma asincrónica?

¿Por qué mvc4 asynccontroller no se puede ejecutar de forma asincrónica?

Para el modelo de solicitud-respuesta HTTP, el servidor no puede notificar ni devolver la llamada activamente al cliente. Cuando el cliente inicia una solicitud, debe mantener la conexión y esperar a que el servidor devuelva el resultado antes de continuar con el procesamiento. la solicitud y la respuesta no pueden ser asincrónicas. Esto significa que no importa cómo el servidor maneje la solicitud, no hay diferencia para el cliente.

Entonces, ¿qué significa ASP.NET asincrónico y qué problemas resuelve?

Antes de explicar ASP.NET asincrónico, primero comprendamos el modelo de subprocesamiento de ASP.NET.

Modelo de subprocesos ASP.NET

Sabemos que los servicios WEB pueden proporcionar servicios a múltiples usuarios al mismo tiempo. Es concebible que los programas WEB se ejecuten en un entorno de subprocesos múltiples. Para los subprocesos que ejecutan programas WEB, podemos llamarlo subproceso WEB, así que primero echemos un vistazo a cómo se ve un subproceso WEB.

Podemos usar HttpHandler para generar algún contenido.

Manejador de clase pública: IHttpHandler{ public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; var thread = Thread.CurrentThread context.Response.Write( string.Format( "Nombre: {0}\r\nManagedThreadId: {1}\r\nIsBackground: {2}\r\nIsThreadPool nIsThreadPoolThread: {3}", hilo.Nombre, hilo.ManagedThreadId, hilo.IsBackground, hilo.IsThreadPoolThread)) ; } public bool IsReusable { get {return true;} }.}} Puede ver lo siguiente:

Nombre:

ManagedThreadId: 57

IsBackground : True

IsThreadPoolThread:True

Como puede ver, el subproceso WEB es un subproceso en un grupo de subprocesos sin nombre. Si actualiza esta página, ManagedThreadId también puede cambiar y puede repetirse. Esto significa que los programas WEB tienen la oportunidad de ejecutarse en diferentes subprocesos en el grupo de subprocesos.

Para simular el acceso simultáneo de múltiples usuarios, necesitamos agregar un retraso artificial al procesador y generar información relacionada con el subproceso, incluida la hora de inicio y finalización, y luego iniciar múltiples solicitudes al mismo tiempo a través de el programa cliente, vea los resultados devueltos y analice el proceso de procesamiento de solicitudes.

public void ProcessRequest(contexto HttpContext){ DateTime comenzar = DateTime.Now; int t1, t2, t3; ThreadPool.GetAvailableThreads(out t1, GetAvailableThreads(out t1, t2, t3); ThreadPool.GetMaxThreads( salida t2, salida t3); Thread.Sleep(TimeSpan.FromSeconds(10)); Fecha y hora final = Fecha y hora. Ahora; Ahora; HttpContext context.Response.ContentType = "texto/texto"; HttpContext.Response.ContentType = "texto/textffffff}\tEnd: {3: mm: ss, fffffff}\tTPool: {4}", thread.ManagedThreadId, context.ApplicationInstance.GetHashCode(), comienzo, fin, t2 - t1 )); Usamos un programa de línea de comando para iniciar la solicitud y mostrar los resultados.

static void Main(){ var url = new Uri("http://localhost:8012/Handler.ashx"); var num = 50 for (int i = 0; i lt; num; ; i ) { var request = WebRequest.Create(url); request.GetResponseAsync().ContinueWith(t =gt; { var stream = t.Result.GetResponseStream(); usando (TextReader tr = new StreamReader(stream)) { Console.WriteLine(tr.ReadToEnd()); }).}); }Console.ReadLine() }Aquí, iniciamos 50 solicitudes al mismo tiempo y luego observamos la respuesta.

Tenga en cuenta que los resultados pueden variar según el sistema operativo, la versión de IIS, el modo de canalización, la versión de .NET y los elementos de configuración. Los siguientes son los resultados de la configuración predeterminada de Windows Server 2008 R2 IIS7.5 .NET 4.5 beta (tiempo de ejecución de .NET 4). A menos que se indique lo contrario, los siguientes resultados son para la primera ejecución después de reiniciar IIS: .NET 4.5 Beta (.NET 4 Runtime) Configuración predeterminada.

El programa se ve así en mi computadora: