CA2007: Nie czekaj bezpośrednio na zadanie
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2007 |
Tytuł | Nie oczekuj bezpośrednio zadania |
Kategoria | Niezawodność |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Metoda asynchroniczna oczekuje Task 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 być kosztowne pod względem wydajności i może spowodować zakleszczenie wątku interfejsu użytkownika. Rozważ wywołanie Task.ConfigureAwait(Boolean) sygnału o zamiarze kontynuacji.
Jak naprawić naruszenia
Aby naprawić naruszenia, wywołaj ConfigureAwait oczekiwany Taskelement . Można przekazać parametr true
lub false
dla parametru continueOnCapturedContext
.
Wywołanie
ConfigureAwait(true)
zadania ma takie samo zachowanie, jak nie jawne wywoływanie metody 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. Przekazywaniefalse
to 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, należy całkowicie pominąć ostrzeżenie dla projektów reprezentujących kod aplikacji, a nie kod biblioteki; w rzeczywistości uruchomienie tego analizatora w kodzie aplikacji (na przykład kliknięcie przycisków obsługi zdarzeń w projekcie WinForms lub WPF) może prowadzić do niewłaściwego wykonania akcji.
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 kontynuacja funkcji await powinna być uruchamiana w wątku interfejsu użytkownika, a tym samym domyślne zachowanie planowania kontynuacji z powrotem do kontekstu źródłowego jest pożądane. W innym przykładzie podczas pisania kodu w aplikacji ASP.NET Core domyślnie nie SynchronizationContext ma elementu lub TaskScheduler, z którego przyczyna ConfigureAwait
nie spowoduje zmiany ż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ć, które części bazy kodu mają być uruchamiane w tej regule.
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.
Wykluczanie metod asynchronicznego pustości
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