CA2008: Keine Tasks ohne Übergabe eines TaskSchedulers erstellen
Eigenschaft | Wert |
---|---|
Regel-ID | CA2008 |
Titel | Keine Tasks ohne Übergabe eines TaskSchedulers erstellen |
Kategorie | Zuverlässigkeit |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 9 aktiviert | No |
Ursache
Eine Taskerstellung oder ein Fortsetzungsvorgang verwendet eine Methodenüberladung, die keinen TaskScheduler-Parameter angibt.
Regelbeschreibung
Die folgenden .NET-Aufgabenerstellung und Fortsetzungsmethoden verfügen über Überladungen, die eine TaskScheduler-Instanz angeben oder weglassen:
- System.Threading.Tasks.TaskFactory.StartNew Methoden
- System.Threading.Tasks.Task.ContinueWith Methoden
Geben Sie immer ein explizites TaskScheduler-Argument an, um den Current-Standardwert zu vermeiden, dessen Verhalten vom Aufrufer definiert wird und der zur Laufzeit variieren kann. Current gibt den Scheduler zurück, der dem entspricht, was Task momentan in diesem Thread ausführt. Wenn keine solche Aufgabe vorhanden ist, wird Default zurückgegeben, die den Thread-Pool darstellt. Die Verwendung von Current kann in einigen Situationen zu Deadlocks oder Problemen mit der Reaktionsfähigkeit der Benutzeroberfläche führen, wenn die Aufgabe im Thread Pool erstellt wurde, stattdessen aber auf den UI-Thread zurückgelangt.
Weitere Informationen und ausführliche Beispiele finden Sie unter Neue TaskCreationOptions und TaskContinuationOptions in .NET Framework 4.5.
Hinweis
VSTHRD105: Methodenüberladungen vermeiden, die voraussetzen, dass TaskScheduler. Current eine ähnliche Regel ist, die im Microsoft.VisualStudio.Threading.Analyzers-Paket implementiert ist.
Behandeln von Verstößen
Um Verstöße zu beheben, müssen Sie die Methodenüberladung aufrufen, die einenTaskScheduler annimmt und explizit Default oder Current übergibt, um die Absicht klar zu machen.
Wann sollten Warnungen unterdrückt werden?
Diese Warnung ist für Bibliotheken bestimmt, bei denen der Code in beliebigen Umgebungen ausgeführt werden kann und bei denen im Code keine Annahmen getroffen werden sollten, welche Umgebung verwendet wird oder wie der Aufrufer der Methode den Aufruf durchführt oder darauf wartet. Es kann sinnvoll sein, die Warnung für Projekte zu unterdrücken, die den Anwendungscode anstelle von Bibliothekscode darstellen.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.