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 |
|---|---|
| ID pravidla | CA2008 |
| Název | Nevytvářejte úlohy bez použití plánovače úloh. |
| Kategorie | Spolehlivost |
| Oprava je destruktivní nebo nedestruktivní | Nezlomitelný |
| Povoleno ve výchozím nastavení v .NET 10 | Ne |
Příčina
Operace vytvoření nebo pokračování úlohy používá přetížení metody, které nespecifikuje parametr TaskScheduler.
Popis pravidla
Následující metody vytvoření a pokračování úlohy .NET mají přetížení, která umožňují zadat nebo vynechat TaskScheduler instanci:
Vždy zadejte explicitní TaskScheduler argument, který zabrání výchozí Current hodnotě, jejíž chování je definováno volajícím a může se lišit za běhu. Current vrátí plánovač přidružený k čemukoli, co Task je aktuálně spuštěno v daném vlákně. Pokud takový úkol neexistuje, vrátí Default, který představuje fond vláken. Použití Current by mohlo vést k problémům s zablokováním nebo odezvou uživatelského rozhraní v některých situacích, kdy bylo zamýšleno vytvořit úlohu ve fondu vláken, ale místo toho čeká na návrat do vlákna uživatelského rozhraní.
Další informace a podrobné příklady naleznete v tématu New TaskCreationOptions a TaskContinuationOptions v rozhraní .NET Framework 4.5.
Poznámka:
VSTHRD105 – Vyhněte se přetížení metod, které předpokládají TaskScheduler.Current je podobné pravidlo implementované v balíčku Microsoft.VisualStudio.Threading.Analyzers .
Jak opravit porušení
Chcete-li opravit porušení, zavolejte přetížení metody, která přebírá TaskScheduler a explicitně předává Default nebo Current aby byl záměr jasný.
Example
// This code violates the rule.
var badTask = Task.Factory.StartNew(
() =>
{
// ...
}
);
badTask.ContinueWith(
t =>
{
// ...
}
);
// This code satisfies the rule.
var goodTask = Task.Factory.StartNew(
() =>
{
// ...
},
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default
);
goodTask.ContinueWith(
t =>
{
// ...
},
CancellationToken.None,
TaskContinuationOptions.None,
TaskScheduler.Default
);
Kdy potlačit upozornění
Toto upozornění je určeno především pro knihovny, kde může být kód spuštěn v libovolném prostředí a kde by kód neměl provádět předpoklady o prostředí nebo o tom, jak může volající metody tuto metodu vyvolat nebo na ni čekat. Může být vhodné potlačit upozornění pro projekty, které představují kód aplikace, nikoli kód knihovny.
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 CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008
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.CA2008.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.