Freigeben über


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 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:

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.

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.

Siehe auch