Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| Egenskap | Värde |
|---|---|
| Regel-ID | CA2007 |
| Title | Vänta inte direkt på en uppgift |
| Kategori | Tillförlitlighet |
| Korrigeringen är antingen invasiv eller icke-invasiv | Oumbrytbar |
| Aktiverad som standard i .NET 10 | Nej |
| Tillämpliga språk | C# och Visual Basic |
Orsak
En asynkron metod väntarTask direkt.
Regelbeskrivning
När en asynkron metod väntar direkt på Task, sker fortsättningen vanligtvis i samma tråd som skapade tasken, beroende på den asynkrona kontexten. 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, anropa ConfigureAwait på den väntade Task. Du kan skicka antingen true eller false för parametern continueOnCapturedContext .
Att anropa
ConfigureAwait(true)på uppgiften har samma beteende som att inte uttryckligen kalla 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)på uppgiften för att schemalägga fortsättningar i 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;
}
För att åtgärda överträdelsen, anropa ConfigureAwait på 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 händelsehanteraren för ett knapptryck i en applikation i WinForms eller WPF, bör i allmänhet fortsättningen efter en await köras på användargränssnittstråden, och därför är standardbeteendet att schemalägga fortsättningen tillbaka till ursprungskontexten önskvärt. 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 metoder med void-returtyp
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