2012-04-16 6 views
0

私は、StartNewが作業が実際に行われている間にThreadPoolからのスレッドを使用し、待機していたときにそれを解放するという仮定の下にいました。例:StartNewは通話中にスレッドを保持していますか?

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

上記のcmd.ExecuteReader()は、実行に10分かかった非常に遅いストアドプロシージャです。私は、TPLがスレッドをプールに戻し、スレッド全体を保持しないと考えました。これは間違っていますか?そうでなければ、TPLの大きな利点は、バックグラウンドのワーカースレッドと言うことができます。 Stephen Toub's postを読んだ後、私の仮定は真実ではないと考え始めました。

答えて

2

いいえ、それはスレッドが.NETでどのように動作するかではありません。ブロッキング呼び出しを行うと、スレッドは実際にブロックする必要があります。それ以外は何もできません。 *

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

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

* C#5には、非同期コードを同期コードのように見せるコンパイラの魔法があります。しかし、ブロッキングコールはブロッキングコールのままです。

+0

ありがとう私はasp.net非同期操作を呼び出して、あなたがプールに戻るスレッドを解放することができますIO完了ポートを使用しているいくつかの関数を呼び出すと混乱しているね – coding4fun