sociales redes mediatica informacion asp.net-mvc asp.net-mvc-4 async-await

asp.net-mvc - redes - informacion mediatica



Acción asincrónica ASP.NET MVC 4 niño (2)

El formato de la respuesta de Stephen no funcionó para mí (tal vez es un problema de novato asíncrono, pero bueno).

Tuve que escribir la expresión asíncrona en este formato para obtener un valor de retorno fuertemente tipado.

Person myPerson = Task.Run(() => asyncMethodWhichGetsPerson(id)).Result;

Tengo una aplicación ASP.NET MVC 4 orientada a .NET 4.5. Una de las acciones de nuestros hijos realiza una llamada a un servicio web utilizando HttpClient.

Dado que estamos bloqueando a IO esperando la respuesta de HttpClient, tiene mucho sentido convertir el código al patrón async / await. Sin embargo, cuando MVC 4 intenta ejecutar la acción secundaria, obtenemos el siguiente mensaje de error:

HttpServerUtility.Execute bloqueó mientras esperaba que se completara una operación asincrónica.

A primera vista, parece que MVC 4 no admite async / await dentro de una acción secundaria. La única opción restante es ejecutar usando código síncrono y forzar un "Esperar" en la tarea asíncrona.

Como todos sabemos, tocar .Result o .Wait () en una tarea asíncrona en un contexto ASP.NET causará un punto muerto inmediato. Mi lógica asíncrona está envuelta en una biblioteca de clases, así que no puedo usar el truco "await blah.ConfigureAwait (false)". Recuerde, etiquetar "asincrónico" en la acción secundaria y usar esperar produce un error, y eso me impide configurar la espera.

Estoy pintado en una esquina en este punto. ¿Hay alguna forma de consumir métodos asíncronos en una acción de niño MVC 4? Parece un error sin errores.


Todavía hay partes de MVC que no son amigables; Espero que estos se aborden en el futuro. Cree un problema de Connect o UserVoice para esto.

Mi lógica asíncrona está envuelta en una biblioteca de clases, así que no puedo usar el truco "await blah.ConfigureAwait (false)".

Probablemente deberías agregar ConfigureAwait(false) a las llamadas en tu biblioteca de clase (si puedes).

También podría piratear una solución alternativa. Si el método de la biblioteca de su clase no necesita el contexto de ASP.NET, entonces podría tener un hilo del grupo de subprocesos que (a) lo esté esperando:

try { var result = Task.Run(async () => { await MyHttpRequest(...); }).Result; } catch (AggregateException ex) { ... }

El efecto es similar a ConfigureAwait(false) : como MyHttpRequest ejecuta en un contexto de grupo de subprocesos, no intentará ingresar al contexto ASP.NET cuando se complete.