如何将状态对象传递给延续任务?

Hug*_*son 19 .net c# task-parallel-library

我正在使用带有C#的.NET 4.0任务并行库(我第一次使用TPL)

我有一个任务A,我想在完成一系列其他任务(B,C,D等)之前完成任务.因此,我想创建任务B,C,D等作为任务A的延续.但是,我想将"状态"对象传递给任务B,将另一个状态对象传递给任务C等.

我可以通过简单地使用带有状态对象的Task构造函数重载将状态对象传递给任务A,例如http://msdn.microsoft.com/en-us/library/dd783035.aspx描述了这个Task构造函数重载:

Task(Action<Object>, Object, CancellationToken) 
Run Code Online (Sandbox Code Playgroud)

这工作正常,第二个参数是我的"状态"对象.

我想创建一个延续任务,例如任务B:

Task taskB = taskA.ContinueWith(/* args here*/)
Run Code Online (Sandbox Code Playgroud)

但是,我看不到ContinueWith()重载(请参阅http://msdn.microsoft.com/en-us/library/dd235663.aspx),它允许我将"状态"对象传递给延续任务.如何才能做到这一点?

笔记:

  1. 在创建taskA时,我没有taskB的'state'对象
  2. taskB的'state'对象不是taskA的输出(返回值)

对于某些上下文,我正在做的是在几个循环中创建taskB,taskC等,所以我使用状态对象将循环变量的值传递给taskB,taskC等,以避免问题总是以任务中的循环变量的最终值结束(闭包问题).

Jon*_*eet 23

最简单的方法可能是简单地捕捉它在Func<Task, TResult>你进入ContinueWith.例如:

object taskBState = GetStateHere();
Task taskB = taskA.ContinueWith(task => RealContinuation(task, taskBState));
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我发现捕获状态更容易,无论如何都要通过状态传递.

  • 不幸的是,在实现了一些性能影响与状态之后,MS改变了主意([link](http://blogs.msdn.com/b/pfxteam/archive/2011/11/10/10235962.aspx))带闭包的长连续链中的参数.您可以编写适用于4.0和4.5的代码,但不会利用4.5中的显着性能改进; 或者使用显式参数编写特定于4.5的代码而不使用闭包. (4认同)