0

私は、StartNewが実​​際に作業が行われている間だけThreadPoolからのスレッドを使用し、それが待機しているときにそれを解放すると想定していました。例えば:

    Task.Factory.Startnew() {
          () => {
                    ..
                    var dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {
                     ..
                    }
                }
}

つまり、上記のcmd.ExecuteReader()は、実行に10分かかる非常に遅いストアドプロシージャでした。TPLはスレッドをプールに戻し、スレッドをずっと保持しないと思いました。これは間違っていますか?そうでない場合、バックグラウンドワーカースレッドと言うTPLアプローチの大きな利点は何ですか。Stephen Toubの投稿を読んだ後、自分の仮定は正しくないと思い始めました。

4

1 に答える 1

2

いいえ、それは.Netでのスレッドの動作方法ではありません。ブロッキング呼び出しを行うと、スレッドは実際にブロックする必要があり、それ以外のことはできません。TPLにはそれを行う「魔法」はありません。*

ThreadPool.QueueUserWorkItem()基本的に、呼び出しと。の間に大きな違いはありませんTask.Factory.StartNew()。ただし、TPLを使用すると、次のような多くの利点があります。

  1. キャンセルのサポート。
  2. 継続のサポート(task.ContinueWith())。
  3. スレッドプール以外の他のスケジューラーのサポート。最も頻繁に使用されるのは同期コンテキストで、GUIアプリケーションで役立ちます。
  4. タスクのインライン化(​​まだ開始されていないタスクの待機を開始すると、現在のスレッドで実行を開始できます)。
  5. タスクのスレッドローカルキュー。パフォーマンスを向上させることができます。
  6. Taskは将来終了するものの単一の抽象化であり、計算にバインドされたバックグラウンド操作である必要はありません。これは、.Net4.5ではさらに重要になります。

* C#5には、非同期コードを今日の同期コードのように見せることができるコンパイラーの魔法があります。ただし、通話をブロックしても、通話は引き続きブロックされます。

于 2012-04-16T18:01:08.567 に答える