¿Por qué mvc4 asynccontroller no se puede ejecutar de forma asincrónica?
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: