CA2008: не создавайте задачи без передачи TaskScheduler

Свойство Значение
Идентификатор правила CA2008
Заголовок Не создавайте задачи без передачи TaskScheduler
Категория Надежность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Операция создания или продолжения задачи использует перегрузку метода, в которой не указан параметр 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, чтобы прояснить намерение.

Когда лучше отключить предупреждения

Это предупреждение предназначено, в основном, для библиотек, где код может выполняться в произвольных средах и не должен делать предположений о среде или о том, как вызывающий объект метода может вызываться или ожидать метод. Может быть целесообразно отключить это предупреждение для проектов, представляющих код приложения, а не код библиотеки.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

См. также