根据 Stephen Toub (MSFT) 的一篇文章,他们假设我们将依赖闭包来传递状态数据。还有一些关于签名模糊的借口。(http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/1988294c-de41-476a-a104-aa550b7409f5)
然而,依靠闭包来解决这个问题似乎是一个等待更好解决方案的临时黑客。它有效,但它不是一个好的长期解决方案。很多时候,简单地将委托方法指定为操作是最简单的方法,但这意味着我们必须使用全局变量,否则我们将被排除在状态参数传递之外。
我喜欢 Hugo 的一项建议(来自 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 ) { ... }
The TaskState<> solution is not perfect, but it seems like a much better solution than relying on closure of type casting.