http://ufcpp.net/study/csharp/misc_task.html の内容を簡単にまとめてみました。
スレッド
従来の非同期処理として、Threadクラスを使用していた。
これは新規にワーカースレッドを作成・実行させることでバックグラウンド処理を行うものである。
ただし、スレッド(の切り替え)は高コストであり、基本的は直接スレッド作成することは推奨されない。
スレッドの切り替え
「マルチスレッド」処理は並列に処理が行われているように見えるが、実際には一定間隔で実行するスレッドを切り替えしながら各スレッドを少しずつ処理している。
この切り替えは「コンテキストスイッチ」と呼ばれる。以下のようなことを行っている。
現在スレッドのメモリ状態・CPUのレジスター内容の退避
切替先スレッドのメモリ状態・CPUのレジスター内容の復元
コンテキストスイッチ発生回数が減ると、CPUを効率よく利用することができるようになる!これを実現しているのがスレッドプールの仕組みとなる。
スレッドプール
スレッドを有効利用するための仕組み。以下のようなことを行う。
予めいくらかのスレッドを作成しておく。
各スレッドではスレッドプールが持つキューに追加されたタスクを取り出し実行する。
タスク
.NET4.0では、Task.Factory.StartNewメソッド でタスクの生成・スレッドプールへのキューイングを行う。
.NET4.5からは、前述のメソッドに追加して Task.Runメソッド が追加された。(機能的にはStartNew()と変わらない。複雑であった引数体系をシンプルにしたものとのこと。)