Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
| Имущество | Значение |
|---|---|
| Идентификатор правила | CA2008 |
| Заголовок | Не создавайте задачи без передачи TaskScheduler |
| Категория | Надежность |
| Исправление является разрушающим или неразрушающим | Неразрывное |
| Включен по умолчанию в .NET 10 | Нет |
Причина
Операция создания или продолжения задачи использует перегрузку метода, в которой не указан параметр TaskScheduler.
Описание правила
Следующие методы создания и продолжения задачи .NET имеют перегрузки, позволяющие указывать или опускать экземпляр TaskScheduler:
Всегда указывайте явный TaskScheduler аргумент, чтобы избежать значения по умолчанию Current , поведение которого определяется вызывающим оператором и может отличаться во время выполнения. Current возвращает планировщик, связанный с Task, который в данный момент выполняется в этом потоке. Если такой задачи нет, возвращается значение Default, представляющее пул потоков. Использование Current может привести к взаимоблокировкам или проблемам со скоростью реагирования пользовательского интерфейса в некоторых ситуациях, когда планировалось создание задачи в пуле потоков, а вместо этого ожидается возврат в поток пользовательского интерфейса.
Дополнительные сведения и подробные примеры см. в разделе Новые TaskCreationOptions и TaskContinuationOptions в .NET Framework 4.5.
Примечание.
VSTHRD105. Избегайте перегрузок методов, предполагающих TaskScheduler.Current — это аналогичное правило, реализованное в пакете Microsoft.VisualStudio.Threading.Analyzers.
Устранение нарушений
Чтобы устранить нарушения, вызовите перегрузку метода, которая принимает TaskScheduler, и явно передайте Default или Current для четкости намерения.
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
);
Когда лучше отключить предупреждения
Это предупреждение предназначено прежде всего для библиотек, где код может выполняться в произвольных средах, и не следует делать предположений о среде или о том, как вызывающий метод объект может его вызывать или ожидать его выполнения. Может быть целесообразно отключить это предупреждение для проектов, представляющих код приложения, а не код библиотеки.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.