CA2008: не создавайте задачи без передачи TaskScheduler
Свойство | Значение |
---|---|
Идентификатор правила | CA2008 |
Заголовок | Не создавайте задачи без передачи TaskScheduler |
Категория | Надежность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | 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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.