Delen via


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 8 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. Doorgeven false is een goede optie voor app-onafhankelijke bibliotheken.

Voorbeeld

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

Zie ook