| プロパティ | 値 |
|---|---|
| ルール 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
詳細については、「 コード分析の警告を抑制する方法」を参照してください。
関連項目
.NET