CA2008: Skapa inte aktiviteter utan att skicka en TaskScheduler
Property | Värde |
---|---|
Regel-ID | CA2008 |
Title | Skapa inte aktiviteter utan att skicka en TaskScheduler |
Kategori | Tillförlitlighet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En aktivitetsskapande eller fortsättningsåtgärd använder en metodöverbelastning som inte anger någon TaskScheduler parameter.
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:
- System.Threading.Tasks.TaskFactory.StartNew metoder
- System.Threading.Tasks.Task.ContinueWith metoder
Ange alltid ett explicit TaskScheduler argument för att undvika standardvärdet Current , vars beteende definieras av anroparen och kan variera vid körning. Current returnerar schemaläggaren som är associerad med det som Task för närvarande körs på den tråden. Om det inte finns någon sådan uppgift returneras Default, som representerar trådpoolen. Användning Current kan leda till problem med dödlägen eller UI-svarstider i vissa situationer, när den var avsedd att skapa uppgiften i trådpoolen, men i stället väntar den på att komma tillbaka till användargränssnittstråden.
Mer information och detaljerade exempel finns i New TaskCreationOptions and TaskContinuationOptions in .NET Framework 4.5.
Kommentar
VSTHRD105 – Undvik metodöverbelastningar som förutsätter att TaskScheduler.Current är en liknande regel som implementeras i paketet Microsoft.VisualStudio.Threading.Analyzeers .
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.
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.
Ignorera 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.