.NET TPL: Task.Run()、Task.Factory.StartNew()、および Task.Start() について
最新のアプリケーションでは同時実行性が非常に重要であり、.NET のタスク並列ライブラリ (TPL) は同時操作を管理するための強力なツールを提供します。 この記事では、タスクの作成と開始に関する Task.Run()
、Task.Factory.StartNew()
、Task.Start()
の違いを明確にします。
TPL でのタスクの作成と実行
TPL タスクは独立した作業単位を表します。 デリゲートまたはラムダ式を使用して作業を定義し、実行のスケジュールを設定します。これを促進する 3 つの主な方法:
Task.Start()
: 時代遅れとみなされます。代わりに Task.Factory.StartNew()
を使用してください。Task.Run()
: .NET 4.5 で導入されたこの簡素化されたメソッドは、スレッド プールでタスクを安全かつ効率的に実行する方法を提供します。Task.Factory.StartNew()
: タスクの作成とスケジュールをきめ細かく制御し、高度なカスタマイズを可能にします。主な違いとベストプラクティス
3 つのメソッドはすべて最終的にタスクを実行しますが、その機能と適合性は次のように異なります。
Task.Run()
: ほとんどのシナリオで推奨されるアプローチ。これにより、スレッド プールが暗黙的に利用され、タスクの作成が簡素化され、子タスクの添付に関する潜在的な問題が防止されます。 その単純な性質により、汎用の非同期操作に最適です。
Task.Factory.StartNew()
: Task.Run()
のデフォルトの動作では不十分な場合に使用します。 TaskCreationOptions.LongRunning
(長時間実行タスク用) などのオプションを指定し、カスタム スケジューラを選択できます。これにより最大限の柔軟性が得られますが、TPL の内部構造をより深く理解する必要があります。
Task.Start()
: 制御ができず、同期の問題が発生する可能性があるため、絶対に必要な場合を除き、この方法は避けてください。 Task.Factory.StartNew()
に置き換えるのが最適です。
各メソッドをいつ使用するか
Task.Run()
: ほとんどの非同期操作のデフォルトの選択。 そのシンプルさと効率性により、ほとんどの開発者にとって好まれる方法となっています。
Task.Factory.StartNew()
: 次の場合に使用します。
TaskCreationOptions
(例: LongRunning
) を設定する必要があります。Task.Start()
を使用するレガシー コードを使用しています。Task.Start()
: 通常、このメソッドの使用は避けてください。
例:
<code class="language-csharp">// Using Task.Run() Task taskA = Task.Run(() => Console.WriteLine("Hello from TaskA")); // Using Task.Factory.StartNew() with TaskCreationOptions.LongRunning Task taskB = Task.Factory.StartNew(() => { Console.WriteLine("Hello from TaskB"); }, TaskCreationOptions.LongRunning);</code>
以上がTask.Run()、Task.Factory.StartNew()、および Task.Start(): それぞれをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。