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 9 | 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