CA2007: Nie czekaj bezpośrednio na zadanie

Właściwości Wartość
Identyfikator reguły CA2007
Stanowisko Nie oczekuj bezpośrednio zadania
Kategoria Niezawodność
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Metoda asynchroniczna oczekujeTask 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. Przekazywanie false 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

Zobacz też