Actualización: ASP.NET Core no tiene unSynchronizationContext
. Si está en ASP.NET Core, no importa si lo usa ConfigureAwait(false)
o no.
Para ASP.NET "Completo" o "Clásico" o lo que sea, el resto de esta respuesta aún se aplica.
Publicación original (para ASP.NET no Core):
Este video del equipo de ASP.NET tiene la mejor información sobre el uso async
en ASP.NET.
Había leído que es más eficiente ya que no tiene que cambiar los contextos de hilo al contexto de hilo original.
Esto es cierto con las aplicaciones de interfaz de usuario, donde solo hay un hilo de interfaz de usuario al que debe "sincronizar" nuevamente.
En ASP.NET, la situación es un poco más compleja. Cuando un async
método reanuda la ejecución, toma un hilo del grupo de hilos ASP.NET. Si deshabilita el uso de la captura de contexto ConfigureAwait(false)
, entonces el hilo simplemente continúa ejecutando el método directamente. Si no deshabilita la captura de contexto, el hilo volverá a ingresar el contexto de solicitud y luego continuará ejecutando el método.
Por ConfigureAwait(false)
lo tanto, no le ahorra un salto de hilo en ASP.NET; le ahorra el reingreso del contexto de solicitud, pero esto normalmente es muy rápido. ConfigureAwait(false)
podría ser útil si está intentando hacer una pequeña cantidad de procesamiento paralelo de una solicitud, pero realmente TPL es una mejor opción para la mayoría de esos escenarios.
Sin embargo, con ASP.NET Web Api, si su solicitud llega en un hilo, y espera alguna función y llama a ConfigureAwait (falso) que podría ponerlo en un hilo diferente cuando devuelva el resultado final de su función ApiController .
En realidad, solo hacer un await
puede hacer eso. Una vez que su async
método llega a un await
, el método se bloquea pero el subproceso vuelve al grupo de subprocesos. Cuando el método está listo para continuar, cualquier subproceso se extrae del grupo de subprocesos y se utiliza para reanudar el método.
La única diferencia que ConfigureAwait
hace en ASP.NET es si ese hilo ingresa al contexto de solicitud al reanudar el método.
Tengo más información de fondo en mi artículo de MSDNSynchronizationContext
y en mi async
entrada de blog de introducción .
HttpContext.Current
es operado por ASP.NETSynchronizationContext
, que fluye de manera predeterminada cuando ustedawait
, pero no lo haceContinueWith
. OTOH, el contexto de ejecución (incluidas las restricciones de seguridad) es el contexto mencionado en CLR a través de C #, y es fluido por ambosContinueWith
yawait
(incluso si lo usaConfigureAwait(false)
).