CA2007: Nečekejte přímo na úkol

Vlastnost Hodnota
ID pravidla CA2007
Název Nečekejte přímo na úlohu
Kategorie Spolehlivost
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Asynchronní metoda čekáTask přímo.

Popis pravidla

Když asynchronní metoda čeká Task přímo, pokračování obvykle probíhá ve stejném vlákně, které vytvořilo úlohu v závislosti na asynchronním kontextu. Toto chování může být nákladné z hlediska výkonu a může vést k zablokování ve vlákně uživatelského rozhraní. Zvažte volání Task.ConfigureAwait(Boolean) , které bude signalizovat váš záměr pokračování.

Jak opravit porušení

Chcete-li opravit porušení, zavolejte ConfigureAwait na očekávané Task. Parametr můžete předat true nebo false pro tento continueOnCapturedContext parametr.

  • Volání ConfigureAwait(true) na úkol má stejné chování jako explicitní volání ConfigureAwait. Explicitním voláním této metody dáte čtenářům vědět, že chcete záměrně provést pokračování v původním kontextu synchronizace.

  • Voláním úlohy naplánujte ConfigureAwait(false) pokračování do fondu vláken, čímž se zabrání zablokování ve vlákně uživatelského rozhraní. Předávání false je dobrou volbou pro knihovny nezávislé na aplikacích.

Příklad

Následující fragment kódu vygeneruje upozornění:

public async Task Execute()
{
    Task task = null;
    await task;
}

Chcete-li opravit porušení, zavolejte ConfigureAwait na očekávané Task:

public async Task Execute()
{
    Task task = null;
    await task.ConfigureAwait(false);
}

Kdy potlačit upozornění

Toto upozornění je určeno pro knihovny, kde se může kód spouštět v libovolných prostředích a kde by kód neměl provádět předpoklady o prostředí nebo jak volající metody může vyvolat nebo čekat na něj. Obecně je vhodné potlačit upozornění zcela pro projekty, které představují kód aplikace, nikoli kód knihovny; Ve skutečnosti spuštění tohoto analyzátoru v kódu aplikace (například kliknutí na tlačítko obslužné rutiny událostí v projektu WinForms nebo WPF) pravděpodobně povede k nesprávným akcím, které se provádějí.

Toto upozornění můžete potlačit v jakékoli situaci, kdy by se pokračování mělo naplánovat zpět do původního kontextu nebo tam, kde neexistuje takový kontext. Například při psaní kódu v obslužné rutině události kliknutí na tlačítko v aplikaci WinForms nebo WPF, obecně pokračování z operátoru await by se mělo spustit ve vlákně uživatelského rozhraní, a proto je žádoucí výchozí chování plánování pokračování zpět do původního kontextu. Jako další příklad, když píšete kód v aplikaci ASP.NET Core, ve výchozím nastavení neexistuje žádná SynchronizationContext nebo TaskScheduler, z jakého ConfigureAwait důvodu by se ve skutečnosti nezměnilo žádné chování.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

#pragma warning disable CA2007
// The code that's violating the rule is on this line.
#pragma warning restore CA2007

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

[*.{cs,vb}]
dotnet_diagnostic.CA2007.severity = none

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Konfigurace kódu pro analýzu

Pomocí následujících možností můžete nakonfigurovat, pro které části základu kódu se má toto pravidlo spouštět.

Všechny tyto možnosti můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (spolehlivost), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.

Vyloučení asynchronních metod void

Můžete nakonfigurovat, jestli chcete vyloučit asynchronní metody, které nevrací hodnotu z tohoto pravidla. Pokud chcete tyto druhy metod vyloučit, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:

# 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

Druh výstupu

Můžete také nakonfigurovat, na které druhy výstupních sestavení se má toto pravidlo použít. Pokud například chcete toto pravidlo použít pouze na kód, který vytváří konzolovou aplikaci nebo dynamicky propojenou knihovnu (tj. ne aplikaci uživatelského rozhraní), přidejte do souboru .editorconfig v projektu následující pár klíč-hodnota:

dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary

Viz také