Share via


CA2007: Vänta inte direkt på en uppgift

Property Värde
Regel-ID CA2007
Rubrik Vänta inte direkt på en aktivitet
Kategori Tillförlitlighet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

En asynkron metod väntarTask 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 skicka false ä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

Se även