Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz 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ść |
|---|---|
| Nazwa typu | ForwardCancellationTokenToInvocations |
| Identyfikator reguły | CA2016 |
| Tytuł | Prześlij dalej parametr CancellationToken do metod, które go przyjmują |
| Kategoria | Niezawodność |
| Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Jako sugestia |
Przyczyna
Ta reguła lokalizuje wywołania metod, które mogą akceptować CancellationToken parametr, ale nie są przekazywane, i sugeruje przekazanie do nich metody nadrzędnej CancellationToken .
Opis reguły
Ta reguła analizuje definicje metod, które przyjmują CancellationToken jako ostatni parametr, a następnie analizuje wszystkie metody wywoływane w jego treści. Jeśli którykolwiek z wywołań metody może zaakceptować CancellationToken jako ostatni parametr lub mieć przeciążenie, które przyjmuje CancellationToken jako ostatni parametr, reguła sugeruje użycie tej opcji zamiast tego, aby upewnić się, że powiadomienie anulowania zostanie rozpropagowane do wszystkich operacji, które mogą go nasłuchiwać.
Uwaga
Reguła CA2016 jest dostępna we wszystkich wersjach platformy .NET, w których CancellationToken typ jest dostępny. Odpowiednie wersje można znaleźć w sekcji CancellationToken "Dotyczy".
Jak naprawić naruszenia
Naruszenia można naprawić ręcznie lub użyć poprawki kodu dostępnej w programie Visual Studio. Umieść kursor na żarówki, która jest wyświetlana obok wywołania metody i wybierz sugerowaną zmianę.
W poniższym przykładzie przedstawiono dwa sugerowane zmiany:
Można bezpiecznie pominąć naruszenie tej reguły, jeśli nie obawiasz się przekazywania powiadomienia o anulowanej operacji do niższych wywołań metod. Możesz również jawnie przekazać default kod C# (Nothing w Visual Basic) lub None pominąć naruszenie reguły.
Reguła może wykrywać różne naruszenia. W poniższych przykładach pokazano przypadki, w których reguła może wykryć:
Przykład 1
Reguła sugeruje przekazywanie parametru ct z MyMethod do MyMethodWithDefault wywołania, ponieważ metoda definiuje opcjonalny parametr tokenu:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault();
}
}
}
Naprawa:
ct Prześlij dalej parametr:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(ct);
}
Jeśli nie martwisz się o przekazywanie powiadomień o anulowaniu do niższych wywołań, możesz wykonać następujące czynności:
Jawne przekazywanie default:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(default);
}
Lub jawnie przekaż :CancellationToken.None
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(CancellationToken.None);
}
Przykład 2
Reguła sugeruje przekazywanie parametru ct z MyMethod do MyMethodWithOverload wywołania, ponieważ metoda ma przeciążenie, które przyjmuje CancellationToken parametr:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload()
{
}
public static void MyMethodWithOverload(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload();
}
}
}
Naprawa:
ct Prześlij dalej parametr:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(ct);
}
Jeśli nie martwisz się o przekazywanie powiadomień o anulowaniu do niższych wywołań, możesz wykonać następujące czynności:
Jawne przekazywanie default:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(default);
}
Lub jawnie przekaż :CancellationToken.None
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(CancellationToken.None);
}
Przykłady braku naruszeń
Parametr CancellationToken w metodzie nadrzędnej nie znajduje się w ostatniej pozycji:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct, int lastParameter)
{
MyMethodWithDefault();
}
}
}
Parametr CancellationToken w metodzie domyślnej nie znajduje się w ostatniej pozycji:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default, int lastParameter = 0)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault();
}
}
}
Parametr CancellationToken w metodzie przeciążenia nie znajduje się w ostatniej pozycji:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload(int lastParameter)
{
}
public static void MyMethodWithOverload(CancellationToken ct, int lastParameter)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload();
}
}
}
Metoda nadrzędna definiuje więcej niż jeden CancellationToken parametr:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct1, CancellationToken ct2)
{
MyMethodWithDefault();
}
}
}
Metoda z wartościami domyślnymi definiuje więcej niż jeden CancellationToken parametr:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct1 = default, CancellationToken ct2 = default)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault();
}
}
}
Przeciążenie metody definiuje więcej niż jeden CancellationToken parametr:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload(CancellationToken ct1, CancellationToken ct2)
{
}
public static void MyMethodWithOverload()
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload();
}
}
}
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 CA2016
// The code that's violating the rule is on this line.
#pragma warning restore CA2016
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2016.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.