Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| Eigenschaft | Wert |
|---|---|
| Regel-ID | CA2008 |
| Titel | Keine Tasks ohne Übergabe eines TaskSchedulers erstellen |
| Kategorie | Zuverlässigkeit |
| Fix ist defekt oder nicht defekt | Nicht unterbrechend |
| Standardmäßig in .NET 10 aktiviert | Nein |
Ursache
Eine Aufgabenerstellung oder eine Fortsetzungsoperation verwendet eine Methodenüberladung, die keinen TaskScheduler-Parameter angibt.
Regelbeschreibung
Die folgenden Methoden zur .NET-Aufgabenerstellung und -fortsetzung verfügen über Überladungen, die das Angeben oder Weglassen einer TaskScheduler-Instanz ermöglichen:
- System.Threading.Tasks.TaskFactory.StartNew Methoden
- System.Threading.Tasks.Task.ContinueWith Methoden
Geben Sie immer ein explizites TaskScheduler Argument an, um den Standardwert Current zu vermeiden, dessen Verhalten vom Aufrufer definiert ist und 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 eigentlich im Thread Pool erstellt werden sollte, aber stattdessen darauf wartet, auf den UI-Thread zurückzukehren.
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.
Beheben 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.
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
);
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, setzen Sie den Schweregrad auf none in der Konfigurationsdatei fest.
[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.