TPL Dataflowは、高度な同時実行アプリケーションのためのマイクロソフトの新しいライブラリである。非同期メッセージのパッシングやパイプラインを使用して、スレッドプール以上のコントロールとマニュアルスレッディング以上のパフォーマンスを約束している。欠点は、.NETプログラマにはなじみが薄いであろうデザインパターンを厳守しなくてはならないことである。
Dataflowは、「ブロック」の組み合わせで構成されている。それぞれのブロックは、CCRのポートとして知られ、データのソースまたはターゲットとすることができる。データは通常、ISourceBlock<T>とITargetBlock<T>の両方を実装したプロパゲーションブロックによってポストされて、データフローにエントリする。このブロックがソースの場合、おそらく他のターゲットかプロパゲーションブロックにリンクされている。データフローは、あるブロックから次へ非同期で処理され、ときどきソースまたはターゲットでそれが必要になるまで待機する。
名前が示すように、TPL Dataflowは、.NET 4のTask Parallel Libraryを基盤にしている。そして、TPLのようにカスタム実装することによりデフォルトスケジューラを置き換えることができる。初期状態では、.NETのスレッドプールシステムがベースとなっているものとsynchronization contextフレームワークがある。後者は、データフローをGUIの操作に使うときなど、データフローを特定のスレッド上で実行したい場合に使用する。ドキュメントでは、この点がクリアに書かれていないが、ブロック間のスケジューラでセットして表示することができる。もしこれが事実なら、これはGUIスレッドとの間でデータをやりとりするためのすばらしい仕組みを提供することになる。
デフォルトでデータフローは、公正さよりパフォーマンスに調整されている。あるブロックがアクティブになると、実行が終わるまでプロセスのデータが継続される。あるブロックがすべての有効なリソースを消費するのを避けるため、メッセージの数を制限することができる。セットされると、ブロックは終了前に現在のタスクと他のタスクに引き継げるようにデータを処理する。
ブロックは、無尽蔵に、もしくは節約してデータを消費する。後者は、いくつかのソースから複数のターゲットにメッセージを送るときに非常に重要になる。たとえば、複数のターゲットをロードバランスすることで、それらのターゲットが確実に節約されるようになり、最初の無尽蔵ブロックにすべてを消費されることを避けることができる。他の理由として、節約するブロックは、より新しいバージョンで置き換えたときに、メッセージがドロップされる。この例は、ブロードキャストブロックである。それぞれのメッセージは、そのターゲットに送られる。ターゲットがブロックを受け付けなかった場合、次回ブロードキャストブロックがメッセージを受け取るまで残りを利用することができる。
ロックの問題については、TPL Dataflowは、デッドロックを回避するために興味深い設計をしている。複数のソースからの入力でブロックが必要になったとき、すべてのソースのデータが有効になるまで待つ。そのポイントでは、、それが実際にそれぞれのソースから取得したデータであることを保証するために2フェーズコミットを使う。このメカニズムを信頼して、ワークフローの内部でのマニュアルロックを行わないことが強く推奨されている。
このデザインは、特に競合条件に結合することができるブロードキャストのようなブロックと結合するのに適している。実際にはあるメッセージが配信され、複数のブロックに作用する時に問題がある。ロックはスケジューラでインターフェイスできるので、メッセージを不変データ型で使う方がはるかに安全である。
TPL Dataflow libraryは、Async CTPとともに公開されている。