CA2007: Vänta inte direkt på en uppgift
Property | Värde |
---|---|
Regel-ID | CA2007 |
Title | Vänta inte direkt på en aktivitet |
Kategori | Tillförlitlighet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En asynkron metod väntar Task direkt.
Regelbeskrivning
När en asynkron metod väntar direkt Task sker fortsättningen vanligtvis i samma tråd som skapade uppgiften, beroende på asynkron kontext. Det här beteendet kan vara kostsamt när det gäller prestanda och kan leda till ett dödläge i användargränssnittstråden. Överväg att ringa Task.ConfigureAwait(Boolean) för att signalera din avsikt för fortsättning.
Så här åtgärdar du överträdelser
Om du vill åtgärda överträdelser anropar ConfigureAwait du den väntade Task. Du kan skicka antingen true
eller false
för parametern continueOnCapturedContext
.
Att anropa
ConfigureAwait(true)
aktiviteten har samma beteende som att inte uttryckligen anropa ConfigureAwait. Genom att uttryckligen anropa den här metoden meddelar du läsarna att du avsiktligt vill utföra fortsättningen på den ursprungliga synkroniseringskontexten.Anropa
ConfigureAwait(false)
aktiviteten för att schemalägga fortsättningar till trådpoolen, vilket undviker ett dödläge i användargränssnittstråden. Att skickafalse
är ett bra alternativ för appoberoende bibliotek.
Exempel
Följande kodfragment genererar varningen:
public async Task Execute()
{
Task task = null;
await task;
}
Om du vill åtgärda överträdelsen anropar ConfigureAwait du den väntade Task:
public async Task Execute()
{
Task task = null;
await task.ConfigureAwait(false);
}
När du ska ignorera varningar
Den här varningen är 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 är i allmänhet lämpligt att ignorera varningen helt och hållet för projekt som representerar programkod i stället för bibliotekskod. Faktum är att om du kör den här analysatorn på programkoden (till exempel knappklickshändelsehanterare i ett WinForms- eller WPF-projekt) kommer det sannolikt att leda till att fel åtgärder vidtas.
Du kan utelämna den här varningen i alla situationer där fortsättningen antingen ska schemaläggas tillbaka till den ursprungliga kontexten eller där det inte finns någon sådan kontext på plats. När du till exempel skriver kod i en knapp klickar du på händelsehanteraren i ett WinForms- eller WPF-program, i allmänhet bör fortsättningen från en inväntning köras på användargränssnittstråden, och därför är standardbeteendet att schemalägga fortsättningen tillbaka till ursprungskontexten önskvärd. Som ett annat exempel, när du skriver kod i ett ASP.NET Core-program, finns det som standard inget SynchronizationContext eller TaskScheduler, av vilken anledning en ConfigureAwait
faktiskt inte skulle ändra något beteende.
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 CA2007
// The code that's violating the rule is on this line.
#pragma warning restore CA2007
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.CA2007.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Du kan konfigurera alla dessa alternativ för just den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (tillförlitlighet) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Exkludera asynkrona void-metoder
Du kan konfigurera om du vill undanta asynkrona metoder som inte returnerar ett värde från den här regeln. Om du vill undanta den här typen av metoder lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
# Package version 2.9.0 and later
dotnet_code_quality.CA2007.exclude_async_void_methods = true
# Package version 2.6.3 and earlier
dotnet_code_quality.CA2007.skip_async_void_methods = true
Typ av utdata
Du kan också konfigurera vilka typer av utdatasammansättning som regeln ska tillämpas på. Om du till exempel bara vill tillämpa den här regeln på kod som skapar ett konsolprogram eller ett dynamiskt länkat bibliotek (dvs. inte en UI-app) lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary