Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA2007 |
| Tytuł | Nie czekaj bezpośrednio na Task |
| Kategoria | Niezawodność |
| Poprawka łamiąca lub nienaruszająca | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Nie. |
| Zastosowane języki | C# i Visual Basic |
Przyczyna
Metoda asynchroniczna oczekuje naTask bezpośrednio.
Opis reguły
Gdy metoda asynchroniczna oczekuje Task bezpośrednio, kontynuacja zwykle występuje w tym samym wątku, który utworzył zadanie, w zależności od kontekstu asynchronicznego. Takie zachowanie może wiązać się z wysokimi kosztami pod względem wydajności i może spowodować zakleszczenie w wątku interfejsu użytkownika. Rozważ wywołanie Task.ConfigureAwait(Boolean), aby oznaczyć zamiar kontynuacji.
Jak naprawić naruszenia
Aby naprawić naruszenia, wywołaj ConfigureAwait na oczekiwanym Task. Można przekazać parametr true lub false dla parametru continueOnCapturedContext .
Wywołanie
ConfigureAwait(true)na zadaniu ma takie samo zachowanie, jak niejawne wywołanie ConfigureAwait. Jawnie wywołując tę metodę, możesz poinformować czytelników, że celowo chcesz wykonać kontynuację w oryginalnym kontekście synchronizacji.Wywołanie
ConfigureAwait(false)zadania w celu zaplanowania kontynuacji puli wątków, co pozwala uniknąć zakleszczenia wątku interfejsu użytkownika. Przekazywaniefalseto dobra opcja dla bibliotek niezależnych od aplikacji.
Przykład
Poniższy fragment kodu generuje ostrzeżenie:
public async Task Execute()
{
Task task = null;
await task;
}
Aby naprawić naruszenie, wywołaj ConfigureAwait oczekiwane Taskpolecenie :
public async Task Execute()
{
Task task = null;
await task.ConfigureAwait(false);
}
Kiedy pomijać ostrzeżenia
To ostrzeżenie jest przeznaczone dla bibliotek, w których kod może być wykonywany w dowolnych środowiskach i gdzie kod nie powinien podejmować założeń dotyczących środowiska ani sposobu wywoływania metody lub oczekiwania na nie. Ogólnie rzecz biorąc, dla projektów reprezentujących kod aplikacji, a nie kod biblioteki, warto całkowicie zignorować to ostrzeżenie; w rzeczywistości uruchomienie tego analizatora na kodzie aplikacji (na przykład w obsłudze zdarzeń kliknięcia przycisku w projekcie WinForms lub WPF) prawdopodobnie doprowadzi do podjęcia niewłaściwych działań.
To ostrzeżenie można pominąć w każdej sytuacji, w której kontynuacja powinna zostać zaplanowana z powrotem do oryginalnego kontekstu lub gdy nie ma takiego kontekstu. Na przykład podczas pisania kodu w procedurze obsługi zdarzeń kliknięcia przycisku w aplikacji WinForms lub WPF, zazwyczaj kontynuacja po operacji await powinna być uruchamiana na wątku interfejsu użytkownika, a zatem domyślne zachowanie polegające na przywróceniu kontynuacji do kontekstu początkowego jest pożądane. Podczas pisania kodu w aplikacji ASP.NET Core, domyślnie nie ma ani SynchronizationContext, ani TaskScheduler, z tego powodu ConfigureAwait nie zmieni żadnego zachowania.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2007
// The code that's violating the rule is on this line.
#pragma warning restore CA2007
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2007.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Konfigurowanie kodu do analizowania
Użyj poniższych opcji, aby skonfigurować, na które części bazy kodu ma być stosowana ta reguła.
Można skonfigurować wszystkie te opcje tylko dla tej reguły, dla wszystkich reguł, których dotyczy, lub dla wszystkich reguł w tej kategorii (niezawodność), których dotyczy. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.
Wyklucz metody async void
Możesz skonfigurować, czy chcesz wykluczyć metody asynchroniczne, które nie zwracają wartości z tej reguły. Aby wykluczyć te rodzaje metod, dodaj następującą parę klucz-wartość do pliku .editorconfig w projekcie:
# 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
Rodzaj danych wyjściowych
Można również skonfigurować typy zestawów wyjściowych, do których ma być stosowana ta reguła. Aby na przykład zastosować tę regułę tylko do kodu tworzącego aplikację konsolową lub dynamicznie połączoną bibliotekę (czyli nie aplikację interfejsu użytkownika), dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:
dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary