CA2007: No esperar una tarea directamente
Propiedad | Value |
---|---|
Identificador de la regla | CA2007 |
Título | No esperar una tarea directamente |
Categoría | Confiabilidad |
La corrección es problemática o no problemática | Poco problemático |
Habilitado de forma predeterminada en .NET 9 | No |
Causa
Un método asincrónico espera un Task directamente.
Descripción de la regla
Cuando un método asincrónico espera un Task directamente, la continuación se produce normalmente en el mismo subproceso que creó la tarea, dependiendo del contexto asincrónico. Este comportamiento puede ser costoso en términos de rendimiento y puede dar lugar a un interbloqueo en el subproceso de la interfaz de usuario. Considere la posibilidad de llamar a Task.ConfigureAwait(Boolean) para indicar su intención de continuación.
Cómo corregir infracciones
Para corregir infracciones, llame a ConfigureAwait en el Task esperado. Puede pasar true
o false
para el parámetro continueOnCapturedContext
.
Llamar a
ConfigureAwait(true)
en la tarea tiene el mismo comportamiento que no llamar explícitamente a ConfigureAwait. Al llamar explícitamente a este método, está permitiendo a los lectores saber que quiere realizar intencionadamente la continuación en el contexto de sincronización original.Llame a
ConfigureAwait(false)
en la tarea para programar continuaciones en el grupo de subprocesos, evitando así un interbloqueo en el subproceso de la interfaz de usuario. Pasarfalse
es una buena opción para las bibliotecas independientes de la aplicación.
Ejemplo
El siguiente fragmento de código genera la advertencia:
public async Task Execute()
{
Task task = null;
await task;
}
Para corregir la infracción, llame a ConfigureAwait en el Task esperado:
public async Task Execute()
{
Task task = null;
await task.ConfigureAwait(false);
}
Cuándo suprimir las advertencias
Esta advertencia está destinada a las bibliotecas, donde el código se puede ejecutar en entornos arbitrarios y donde el código no debe realizar suposiciones sobre el entorno o sobre cómo el autor de la llamada del método puede invocar o esperar en él. Por lo general, es adecuado suprimir la advertencia por completo para los proyectos que representan código de aplicación en lugar de código de biblioteca; de hecho, la ejecución de este analizador en el código de la aplicación (por ejemplo, los controladores de eventos de clic de botón en un proyecto de WinForms o WPF) puede provocar que se lleven a cabo las acciones incorrectas.
Puede suprimir esta advertencia en cualquier situación en la que la continuación se deba programar de nuevo en el contexto original o allí donde no haya ningún contexto de ese tipo. Por ejemplo, al escribir código en un controlador de eventos de clic de botón en una aplicación WinForms o WPF, en general la continuación de una espera debe ejecutarse en el subproceso de la interfaz de usuario y, por lo tanto, es conveniente el comportamiento predeterminado de la programación de la continuación en el contexto de origen. Otro ejemplo: al escribir código en una aplicación ASP.NET Core, de forma predeterminada, no hay ningún SynchronizationContext o TaskScheduler, por lo que un ConfigureAwait
no cambiará realmente ningún comportamiento.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable CA2007
// The code that's violating the rule is on this line.
#pragma warning restore CA2007
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none
del archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.CA2007.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Configuración del código para analizar
Use las opciones siguientes para configurar en qué partes del código base debe ejecutarse esta regla.
Puede configurar todas estas opciones solo para esta regla, para todas las reglas a las que se aplica o para todas las reglas de esta categoría (Confiabilidad) a las que se aplica. Para más información, vea Opciones de configuración de reglas de calidad de código.
Exclusión de métodos async void
Puede configurar si quiere excluir los métodos asincrónicos que no devuelven un valor de esta regla. Para excluir estos tipos de métodos, agregue el siguiente par clave-valor a un archivo .editorconfig en el proyecto:
# Package version 2.9.0 and later
dotnet_code_quality.CA2007.exclude_async_void_methods = true
# Package version 2.6.3 and earlier
dotnet_code_quality.CA2007.skip_async_void_methods = true
Tipo de salida
También puede configurar los tipos de ensamblado de salida a los que se aplicará esta regla. Por ejemplo, para aplicar esta regla solo al código que produce una aplicación de consola o una biblioteca vinculada dinámicamente (es decir, no una aplicación de interfaz de usuario), agregue el siguiente par clave-valor a un archivo .editorconfig en el proyecto:
dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary