CA2007: Wacht niet rechtstreeks op een taak
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2007 |
Titel | Niet direct wachten op een taak |
Categorie | Betrouwbaarheid |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Een asynchrone methode wacht op een Task rechtstreeks.
Beschrijving van regel
Wanneer een asynchrone methode een Task rechtstreeks wacht, vindt de voortzetting meestal plaats in dezelfde thread die de taak heeft gemaakt, afhankelijk van de asynchrone context. Dit gedrag kan kostbaar zijn in termen van prestaties en kan leiden tot een impasse op de UI-thread. Overweeg het aanroepen Task.ConfigureAwait(Boolean) om uw intentie voor vervolg aan te geven.
Schendingen oplossen
Om schendingen op te lossen, roept u het wachtende TaskaanConfigureAwait. U kunt de parameter doorgeven true
of false
voor de continueOnCapturedContext
parameter.
Het aanroepen van
ConfigureAwait(true)
de taak heeft hetzelfde gedrag als het niet expliciet aanroepen ConfigureAwait. Door deze methode expliciet aan te roepen, laat u lezers weten dat u opzettelijk de voortzetting wilt uitvoeren op de oorspronkelijke synchronisatiecontext.Roep
ConfigureAwait(false)
de taak aan om voortzettingen van de threadgroep te plannen, waardoor er geen impasse is op de UI-thread. Doorgevenfalse
is een goede optie voor app-onafhankelijke bibliotheken.
Opmerking
Met het volgende codefragment wordt de waarschuwing gegenereerd:
public async Task Execute()
{
Task task = null;
await task;
}
Als u de schending wilt oplossen, roept u het wachtende TaskaanConfigureAwait:
public async Task Execute()
{
Task task = null;
await task.ConfigureAwait(false);
}
Wanneer waarschuwingen onderdrukken
Deze waarschuwing is bedoeld voor bibliotheken, waarbij de code kan worden uitgevoerd in willekeurige omgevingen en waar code geen aannames mag doen over de omgeving of hoe de aanroeper van de methode deze aanroept of erop wacht. Het is over het algemeen geschikt om de waarschuwing volledig te onderdrukken voor projecten die toepassingscode vertegenwoordigen in plaats van bibliotheekcode; Het uitvoeren van deze analyse op toepassingscode (bijvoorbeeld knop klikken op gebeurtenis-handlers in een WinForms- of WPF-project) leidt waarschijnlijk tot de verkeerde acties die worden uitgevoerd.
U kunt deze waarschuwing onderdrukken in elke situatie waarin de voortzetting moet worden teruggezet naar de oorspronkelijke context of waar er geen dergelijke context aanwezig is. Wanneer u bijvoorbeeld code schrijft in een knop klikt u op gebeurtenishandler in een WinForms- of WPF-toepassing, in het algemeen moet de voortzetting van een await worden uitgevoerd op de UI-thread en is het standaardgedrag van het plannen van de voortzetting terug naar de oorspronkelijke context wenselijk. Een ander voorbeeld: bij het schrijven van code in een ASP.NET Core-toepassing is er standaard geen SynchronizationContext of TaskScheduler, om welke reden een ConfigureAwait
gedrag niet daadwerkelijk zou wijzigen.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA2007
// The code that's violating the rule is on this line.
#pragma warning restore CA2007
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA2007.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Code configureren om te analyseren
Gebruik de volgende opties om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.
U kunt al deze opties configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (betrouwbaarheid) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.
Asynchrone methoden uitsluiten
U kunt configureren of u asynchrone methoden wilt uitsluiten die geen waarde retourneren van deze regel. Als u dit soort methoden wilt uitsluiten, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:
# 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
Uitvoertype
U kunt ook configureren op welke uitvoerassemblytypen deze regel moet worden toegepast. Als u deze regel bijvoorbeeld alleen wilt toepassen op code die een consoletoepassing of een dynamisch gekoppelde bibliotheek produceert (dus geen UI-app), voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:
dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary