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 |
|---|---|
| Název typu | ForwardCancellationTokenToInvocations |
| ID pravidla | CA2016 |
| Název | Přeposlat parametr CancellationToken metodám, které ho přijmou |
| Kategorie | Spolehlivost |
| Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
| Povoleno ve výchozím nastavení v .NET 10 | Jako návrh |
Příčina
Toto pravidlo vyhledá vyvolání metody, které by mohly přijmout CancellationToken parametr, ale nepředají žádné, a navrhuje předat nadřazenou metodu CancellationToken jim.
Popis pravidla
Toto pravidlo analyzuje definice metody, které jako poslední parametr přebírají CancellationToken , a pak analyzuje všechny metody vyvolané v těle. Pokud některá z vyvolání metody může buď přijmout CancellationToken jako poslední parametr, nebo mít přetížení, které přebírá CancellationToken jako poslední parametr, pak pravidlo navrhne použití této možnosti, aby se zajistilo, že se oznámení o zrušení rozšíří do všech operací, které ho mohou poslouchat.
Poznámka:
Pravidlo CA2016 je k dispozici ve všech verzích .NET, ve kterých CancellationToken je typ dostupný. Informace o příslušných verzích najdete v části CancellationToken "Platí pro".
Jak opravit porušení
Porušení můžete opravit ručně nebo můžete použít opravu kódu dostupnou v sadě Visual Studio. Najeďte myší na žárovku, která se zobrazí vedle vyvolání metody, a vyberte navrženou změnu.
Následující příklad ukazuje dvě navrhované změny:
Je bezpečné potlačit porušení tohoto pravidla, pokud vás nezajímá přesměrování oznámení o zrušené operaci na volání nižší metody. Můžete také explicitně předat default jazyk C# (Nothing v jazyce Visual Basic) nebo None potlačit porušení pravidla.
Pravidlo může detekovat různá porušení. Následující příklady ukazují případy, které pravidlo dokáže rozpoznat:
Příklad 1
Pravidlo navrhne předání parametru ctMyMethod z MyMethodWithDefault vyvolání, protože metoda definuje volitelný 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();
}
}
}
Opravit:
Přeposlání parametru ct :
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(ct);
}
Pokud vás nezajímá přesměrování oznámení o zrušení na nižší počet volání, můžete:
Explicitní předání default:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(default);
}
Nebo explicitně předat CancellationToken.None:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(CancellationToken.None);
}
Příklad 2
Pravidlo navrhne předání parametru ctMyMethod z MyMethodWithOverload vyvolání, protože metoda má přetížení, které přebírá 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();
}
}
}
Opravit:
Přeposlání parametru ct :
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(ct);
}
Pokud vás nezajímá přesměrování oznámení o zrušení na nižší počet volání, můžete:
Explicitní předání default:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(default);
}
Nebo explicitně předat CancellationToken.None:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(CancellationToken.None);
}
Příklady porušení předpisů
Parametr CancellationToken v nadřazené metodě není na poslední pozici:
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 ve výchozí metodě není na poslední pozici:
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 v metodě přetížení není na poslední pozici:
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();
}
}
}
Nadřazená metoda definuje více než 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 s výchozími hodnotami definuje více než 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();
}
}
}
Přetížení metody definuje více než 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();
}
}
}
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 CA2016
// The code that's violating the rule is on this line.
#pragma warning restore CA2016
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.CA2016.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.