Поделиться через


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

Имущество Значение
Идентификатор правила 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

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

См. также