Dela via


CA2008: Skapa inte aktiviteter utan att skicka en TaskScheduler

Fastighet Värde
Regel-ID CA2008
Titel Skapa inte aktiviteter utan att skicka en TaskScheduler
Kategori Tillförlitlighet
Korrigeringen är antingen störande eller icke-störande Icke-brytande
Aktiverad som standard i .NET 9 Nej

Orsak

En skapande eller fortsättning av en uppgift använder en metodöverbelastning som inte specificerar parametern TaskScheduler.

Regelbeskrivning

Följande metoder för att skapa .NET-aktiviteter och fortsättningar har överlagringar som gör det möjligt att ange eller utelämna en TaskScheduler instans:

Ange alltid ett explicit TaskScheduler argument för att undvika standardvärdet Current, vars beteende definieras av anroparen och kan variera under körning. Current returnerar schemaläggaren som är associerad med det som för närvarande körs av Task på den tråd. Om det inte finns någon sådan uppgift returneras Default, som representerar trådpoolen. Användning av Current kan leda till dödlägen eller problem med UI:s svarstider i vissa situationer, när den var avsedd att skapa uppgiften i trådpoolen, men istället väntar den på att komma tillbaka till UI-tråden.

Mer information och detaljerade exempel finns i New TaskCreationOptions and TaskContinuationOptions in .NET Framework 4.5.

Så här åtgärdar du överträdelser

Om du vill åtgärda överträdelser anropar du den metodöverbelastning som tar en TaskScheduler och uttryckligen skickar in Default eller Current för att göra avsikten tydlig.

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
);

När du ska ignorera varningar

Den här varningen är främst avsedd för bibliotek, där koden kan köras i godtyckliga miljöer och där koden inte bör göra antaganden om miljön eller hur anroparen av metoden kan anropa eller vänta på den. Det kan vara lämpligt att ignorera varningen för projekt som representerar programkod i stället för bibliotekskod.

Undertryck en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

#pragma warning disable CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även