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ść |
|---|---|
| Identyfikator reguły | CA2008 |
| Tytuł | Nie twórz zadań bez przekazania klasy TaskScheduler |
| Kategoria | Niezawodność |
| Poprawka generująca błędy lub niegenerująca błędów | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Nie. |
Przyczyna
Operacja tworzenia lub kontynuacji zadania używa przeciążenia metody, które nie określa parametru TaskScheduler .
Opis reguły
Następujące metody tworzenia i kontynuacji zadań platformy .NET mają przeciążenia, które umożliwiają określenie lub pominięcie TaskScheduler wystąpienia:
Zawsze określ jawny TaskScheduler argument, aby uniknąć wartości domyślnej Current , której zachowanie jest definiowane przez obiekt wywołujący i może się różnić w czasie wykonywania. Current Zwraca harmonogram skojarzony z tym, co Task jest aktualnie uruchomione w tym wątku. Jeśli nie ma takiego zadania, zwraca Defaultwartość , która reprezentuje pulę wątków. Użycie Current może prowadzić do zakleszczenia lub problemów z odpowiedzią interfejsu użytkownika w niektórych sytuacjach, gdy miało to na celu utworzenie zadania w puli wątków, ale zamiast tego czeka na powrót do wątku interfejsu użytkownika.
Aby uzyskać więcej informacji i szczegółowe przykłady, zobacz New TaskCreationOptions and TaskContinuationOptions in .NET Framework 4.5 (Nowe instrukcje taskCreationOptions i TaskContinuationOptions w programie .NET Framework 4.5).
Uwaga
VSTHRD105 — unikaj przeciążeń metod, które zakładają, że taskScheduler.Current jest podobną regułą zaimplementowaną w pakiecie Microsoft.VisualStudio.Threading.Analyzers .
Jak naprawić naruszenia
Aby naprawić naruszenia, wywołaj przeciążenie metody, które przyjmuje metodę TaskScheduler i jawnie przekaż Default lub Current , aby intencja jest jasna.
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
);
Kiedy pomijać ostrzeżenia
To ostrzeżenie jest przeznaczone przede wszystkim dla bibliotek, w których kod może być wykonywany w dowolnych środowiskach i gdzie kod nie powinien zakładać środowiska ani sposobu wywoływania metody lub oczekiwania na nie. Może być odpowiednie pomijanie ostrzeżenia dla projektów reprezentujących kod aplikacji, a nie kod biblioteki.
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 CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.