Share via


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 8 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. Pasar false 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

Consulte también