25

どうやら、.NET 4.0 のメソッドは(この投稿によるととにかくTaskFactory.StartNew)の代替として意図されているようです。私の質問は簡単です。理由を知っている人はいますか?ThreadPool.QueueUserWorkItem

TaskFactory.StartNewより良いパフォーマンスがありますか?メモリ使用量が少ないですか?それとも、主にTaskクラスによって提供される追加機能のためですか? 後者の場合、よりもパフォーマンスが悪いStartNew可能性がありますか?QueueUserWorkItem

呼び出しごとにオブジェクトを返すため、実際には よりも多くのメモリをStartNew使用する可能性があるように思えます。これにより、より多くのメモリが割り当てられると予想されます。QueueUserWorkItemTask

いずれにせよ、どちらが高性能シナリオにより適しているか知りたいです。

4

3 に答える 3

7

パフォーマンスは...によって異なります。多数の並列タスクを実行している場合、.net 4タスクのパフォーマンスが向上し、さらにきめ細かい制御が可能になります(より堅牢なキャンセル、複数のタスクを同時に待機する機能、親子タスクの関係を作成する機能、 LongRunningなどを指定します。などなど。)

さらに、独自のTaskSchedulerを指定できるということは、ニーズに合わせてカスタマイズできることを意味します。組み込みのタスクスケジューラは、古いThreadPoolよりもはるかにマルチコアを認識します。

より多くのメモリを使用することに関して。すべてのスレッドは最低1MBのメモリを予約しますが、タスクオブジェクトを格納するために使用されるわずかな量は重要ではありません。それがあなたの最後の心配事だと思います。

于 2010-06-15T17:15:01.913 に答える
6

TaskFactory.StartNewは、高性能シナリオに適しています。

System.Threading.Tasksの一連のクラスと、それらの設計に加えられた注意と、並列ループおよびオプションとの統合によって、生産性が向上します。

System.Threading.Tasksは、ローカリティに適したスレッドプールでの作業の盗用に基づいて構築されているため(重要な場合)、パフォーマンス上の利点も得られます。

-リック

于 2010-06-22T06:50:41.713 に答える
2

見た目からすると、Taskクラスは.Net 4の新しい並列機能で動作するように設計されています。また、タスクを開始/作成するときに、ActionまたはAction<T>直接使用できるように見えます。ただし、これはすべて100%の推測ですが、ドキュメントをざっと見て回っています:)。

于 2010-06-15T17:06:33.057 に答える