Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| 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ífalseje 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