CA2008: No crear tareas sin pasar un elemento TaskScheduler
Propiedad | Value |
---|---|
Identificador de la regla | CA2008 |
Título | No crear tareas sin pasar un elemento TaskScheduler |
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
Una operación de creación o continuación de tareas utiliza una sobrecarga de método que no especifica un parámetro TaskScheduler.
Descripción de la regla
Los siguientes métodos de creación y continuación de tareas de .NET tienen sobrecargas que permiten especificar u omitir una instancia de TaskScheduler:
- Métodos de System.Threading.Tasks.TaskFactory.StartNew
- Métodos de System.Threading.Tasks.Task.ContinueWith
Especifique siempre un argumento explícito TaskScheduler para evitar el valor predeterminado Current, cuyo comportamiento lo define el autor de la llamada y puede variar en tiempo de ejecución. Current devuelve el programador asociado a cualquier Task que se esté ejecutando actualmente en ese subproceso. Si no hay ninguna tarea, devuelve Default, que representa el grupo de subprocesos. El uso de Current puede provocar interbloqueos o problemas de capacidad de respuesta de la interfaz de usuario en algunas situaciones, como cuando se diseñó para crear la tarea en el grupo de subprocesos, pero en su lugar se encuentra en espera para volver a entrar en el subproceso de la interfaz de usuario.
Para obtener más información y ejemplos detallados, consulte Nuevas TaskCreationOptions y TaskContinuationOptions en .NET Framework 4.5.
Nota
VSTHRD105: Evitar sobrecargas de método que asuman TaskScheduler.Current es una regla similar implementada en el paquete Microsoft.VisualStudio.Threading.Analyzers.
Cómo corregir infracciones
Para corregir las infracciones, llame a la sobrecarga del método que toma TaskScheduler y pase explícitamente Default o Current para que la intención sea clara.
Cuándo suprimir las advertencias
Esta advertencia está principalmente destinada a las bibliotecas, donde el código se puede ejecutar en entornos arbitrarios y no debe realizar suposiciones sobre el entorno o sobre cómo el autor de la llamada del método puede invocarlo o esperarlo. Puede ser adecuado suprimir la advertencia en los proyectos que representan código de aplicación en lugar de código de biblioteca.
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 CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008
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.CA2008.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.