CA2008: Non creare attività senza passare un TaskScheduler
Proprietà | valore |
---|---|
ID regola | CA2008 |
Titolo | Non creare attività senza passare un elemento TaskScheduler |
Categoria | Affidabilità |
Correzione che causa un'interruzione o un'interruzione | Nessuna interruzione |
Abilitato per impostazione predefinita in .NET 8 | No |
Causa
Un'operazione di creazione o continuazione di un'attività usa un overload del metodo che non specifica un TaskScheduler parametro.
Descrizione regola
I metodi di creazione e continuazione delle attività .NET seguenti includono overload che consentono di specificare o omettere un'istanza TaskScheduler :
Specificare sempre un argomento esplicito TaskScheduler per evitare il valore predefinito Current , il cui comportamento è definito dal chiamante e può variare in fase di esecuzione. Current restituisce l'utilità di pianificazione associata a qualsiasi elemento Task attualmente in esecuzione in tale thread. Se non esiste un'attività di questo tipo, restituisce Default, che rappresenta il pool di thread. L'uso Current potrebbe causare deadlock o problemi di velocità di risposta dell'interfaccia utente in alcune situazioni, quando è stato progettato per creare l'attività nel pool di thread, ma attende invece di tornare al thread dell'interfaccia utente.
Per altre informazioni ed esempi dettagliati, vedere New TaskCreationOptions and TaskContinuationOptions in .NET Framework 4.5.
Nota
VSTHRD105: evitare overload di metodi che presuppongono TaskScheduler.Current è una regola simile implementata nel pacchetto Microsoft.VisualStudio.Threading.Analyzers .
Come correggere le violazioni
Per correggere le violazioni, chiamare l'overload del metodo che accetta un TaskScheduler oggetto e passa Default in modo esplicito o Current per rendere chiara la finalità.
Quando eliminare gli avvisi
Questo avviso è destinato principalmente alle librerie, in cui il codice può essere eseguito in ambienti arbitrari e dove il codice non deve fare ipotesi sull'ambiente o su come il chiamante del metodo potrebbe richiamare o attendere. Potrebbe essere opportuno eliminare l'avviso per i progetti che rappresentano il codice dell'applicazione anziché il codice della libreria.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none
su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.