WFは何故シングルスレッドモデルなのか?
WFのスレッドがシングルスレッドモデルである理由について知るには、WFの動作原理と目標を理解せねばなりません。おさらいします。WFの最大の特徴はブックマークです。WFは距離に関係なく、プログラムの中断と再開を行えます。この素敵なブックマークは、.NETランタイム上のWFランタイムが制御する事により実現しています。
ここまでの説明で、WFランタイムが鍵を握っている事が分かって頂けると思います。話しを元に戻します。話しの主役であるWFランタイムは、有限オートマトンであり、アクティビティをキューに格納して管理しています。シングルスレッドでなくてはならない理由がここにあります。ブックマークを有限オートマトンで実現するには、スレッドアジリティなのはもちろんのこと、プロセスアジリティでなくてはなりません。つまり、プログラムが特定のスレッドやプロセスに結び付いてはならないのです。
スレッドが保持する変数をコンパイラとOSから見ると、メモリに割り当てられたスタック空間のデータです。このデータをプログラムから操作するには、特別な方法や手順が必要です。ここでWFが宣言的である事を思い出して下さい。特別な方法をWF側から用意すると、宣言的なプログラムではなくなってしまいます。
なおかつ、距離に関係なくプログラムをブックマーク化するには、特定のプロセスと結びついてはなりません。何故ならば、リモートコンピュータのプログラムである事を意識すると、宣言的なプログラムでなくなるからです。いつどこでどのようにプログラムを実行するのかは、WFランタイムが管理する領域なのです。
そして、利用者に意識させず、有限オートマトンでキューを操作するのは、ほぼ不可能と言ってもよいでしょう。もし、WFで真の並列処理を可能にしたければ、「位置独立性」、「拡張性」、「信頼性」の三つの要件を、プログラマに意識させずに満たさなくてはなりません。しかしそれをするには、高度な人工知能が必要となりオーバーヘッドが高すぎます。それが嫌ならば、プログラマが意識し、全てのアクティビティを位置に関係なく、並列でも正常に動くようにプログラミングしなくてはなりません。ですがそんな事をするぐらいならば、有限オートマトンの動作を考える必要がない、普通の並列プログラミングをする方が簡単です。
纏めます。今のところ、WFの存在意義を保つには、シングルスレッドモデルでなくてはなりません。WF4には擬似的な並列処理をする方法が用意されていますが、WFランタイムが並列化しているように見せているだけです。これは悪い知らせの様に聞こえるでしょう。しかし、そうではありません。無闇にスレッドを使用すると大変な被害をもたらします。また、無闇に複雑化すると弊害の方が大きくなります。従って、WFがシングルモデルである事は利点が大きいと言えます。
WFに限らず、制限は不便さだけではなく利点も生み出します。適切な利益を生み出すために敢えて制限を施したWFの設計思想と仕組みは、我々に多くの事を教えてくれます。