次の方法で共有


CA2008:TaskScheduler を渡さずにタスクを作成しない

プロパティ
ルール ID CA2008
タイトル TaskScheduler を渡さずにタスクを作成しない
カテゴリ 確実
修正が破壊的か非破壊的か なし
.NET 10 で既定で有効 いいえ

原因

タスクの作成または継続の操作で、TaskScheduler パラメーターを指定しないメソッド オーバーロードを使用しています。

規則の説明

次の .NET タスクの作成および継続メソッドには、TaskScheduler インスタンスを指定または省略するためのオーバーロードがあります。

呼び出し元によって動作が定義され、実行時に異なる場合がある既定のTaskScheduler値を回避するには、常に明示的なCurrent引数を指定します。 Current は、そのスレッドで現在実行されている Task に関連付けられているスケジューラを返します。 そのようなタスクがない場合は、スレッド プールを表す Default が返されます。 Current を使用すると、スレッド プールでタスクを作成するはずだったのに UI スレッドに戻るのを待っているなど、場合によっては、デッドロックや UI の応答性に関する問題が発生する可能性があります。

詳細と詳細な例については、「 .NET Framework 4.5 の新しい TaskCreationOptions と TaskContinuationOptions」を参照してください。

注意

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

詳細については、「 コード分析の警告を抑制する方法」を参照してください。

関連項目