Stephen Toub (MSFT) の投稿によると、彼らは、状態データを渡すためにクロージャーに依存しようとしていると想定しています。署名のあいまいさについての言い訳もありました。( http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/1988294c-de41-476a-a104-aa550b7409f5 )
ただし、この問題を解決するためにクロージャーに依存することは、より良い解決策を待っている一時的なハックのように思えます。それは機能しますが、長期的な解決策としては適切ではありません。単純にアクションとしてデリゲート メソッドを指定するのが最も簡単な方法であることがよくありますが、それは、グローバル変数を使用する必要があるか、状態パラメーターの受け渡しから除外されることを意味します。
Hugo の提案の 1 つが気に入っています (MS フォーラムの投稿から)。Hugo は、TaskState 型を導入することを提案しました。これは、ジェネリックのあいまいさの問題を回避する賢い方法のようです。
これを Task.Factory.StartNew() シグネチャと Task() コンストラクターに適用すると、次のようになります。
public Task<T>( Action<T> function, TaskState<T> state );
public Task<T,TResult>( Func<T,TResult> function, TaskState<T> state );
ActionState は、Nullable クラスによく似ています。つまり、Value メンバーの単純なラッパーです。実際には、TaskState の使用は次のようになります。
var myTask = new Task( MyMethod, new TaskState( stateInfo ) );
...
public void MyMethod( StateInfo stateInfo ) { ... }
TaskState<> ソリューションは完全ではありませんが、型キャストのクロージャーに依存するよりもはるかに優れたソリューションのようです。