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

Vlastnost Hodnota
ID pravidla CA2007
Název Nečekejte přímo na úlohu
Kategorie Spolehlivost
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

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

Popis pravidla

Když asynchronní metoda čeká na Task přímo, pokračování obvykle probíhá ve stejném vlákně, které vytvořilo úlohu, a to v závislosti na kontextu asynchronního zpracování. 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. Můžete předat buď true nebo false jako continueOnCapturedContext parametr.

  • Volání ConfigureAwait(true) na úkol má stejné chování jako když ConfigureAwait není výslovně voláno. 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 ConfigureAwait(false) na úloze naplánujte pokračování pro fond vláken, čímž se vyhnete zablokování vlákna 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 kód může spouštět v libovolných prostředích a kde by kód neměl dělat předpoklady o prostředí ani o tom, jak volající metoda může kód vyvolat nebo na něj čekat. 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ě by mělo pokračování z operátoru await proběhnout na vlákně uživatelského rozhraní, a proto je žádoucí vrátit pokračování zpět do původního kontextu pomocí výchozího plánování. Jako jiný příklad, když píšete kód v aplikaci ASP.NET Core, ve výchozím nastavení neexistuje žádná SynchronizationContext nebo TaskScheduler, takže by ConfigureAwait 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

Typ 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é