Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | valore |
|---|---|
| ID regola | CA2008 |
| Titolo | Non creare attività senza passare un TaskScheduler |
| Categoria | Affidabilità |
| Correzione che causa o meno un'interruzione | Non rompente |
| Abilitato per impostazione predefinita in .NET 10 | NO |
| Linguaggi applicabili | C# e Visual Basic |
Causa
Un'operazione di creazione o continuazione di un'attività utilizza un overload del metodo che non include un parametro TaskScheduler.
Descrizione regola
I seguenti metodi di creazione e continuazione delle attività .NET hanno sovraccarichi che permettono 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 lo scheduler associato a qualunque cosa Task attualmente in esecuzione su quel thread. Se non esiste un'attività di questo tipo, restituisce Default, che rappresenta il pool di thread. L'uso di Current potrebbe causare deadlock o problemi di reattività dell'interfaccia utente in alcune situazioni, quando era destinato a creare l'attività nel pool di thread, ma invece attende di ritornare 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 il sovraccarico del metodo che accetta un TaskScheduler e passare esplicitamente Default o Current per rendere chiara l'intenzione.
Example
// This code violates the rule.
var badTask = Task.Factory.StartNew(
() =>
{
// ...
}
);
badTask.ContinueWith(
t =>
{
// ...
}
);
// This code satisfies the rule.
var goodTask = Task.Factory.StartNew(
() =>
{
// ...
},
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default
);
goodTask.ContinueWith(
t =>
{
// ...
},
CancellationToken.None,
TaskContinuationOptions.None,
TaskScheduler.Default
);
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à su none nel file di configurazione .
[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.