2011-01-31 54 views
7

TPL有多个TaskContinuationOptions值,用于控制任务在什么情况下执行。例如,TaskContinuationOptions.NotOnCanceled可防止任务在其父项被取消时运行。为什么TPL不支持状态过滤的多任务延续?

但是,这些任务状态过滤器都不适用于多任务延续。你不能这样做:

TaskFactory f = new TaskFactory(); 
Task t1 = new Task (() => Thread.Sleep (5000)); 
Task t2 = new Task (() => Thread.Sleep (4000)); 
Task t3 = f.ContinueWhenAll (new Task[] { t1, t2 }, 
          (tasks) => { ... }, 
          TaskContinuationOptions.OnlyOnRanToCompletion); 

你最终得到一个错误,指出,"It is invalid to exclude specific continuation kinds for continuations off of multiple tasks."

我不明白的是为什么这种情况会从API被排除。为什么不是一个完全有效的用例,只有当所有的前件都以特定的状态结束时,才能让任务运行?

回答

0

“......运行,只有当所有条件在特定状态下结束了......”

注意你的‘所有’一词,我不是MS,但我敢打赌,它必须做将需要包括All,Any,OnlyOne,AllButOne等等的整个TaskContinuationOptions枚举的事实等等。

此外,埃里克利珀总是回答这样的用“这是昂贵和费时添加一个‘简单’的功能的问题。路moreso,比获得的基本权利,让用户实现的其余部分。

0

ContinueWhenAll手段“所有任务都成功完成后继续运行”指定NotOn*OnlyOn*将与该定义相反或多余。请参阅this MSDN article的备注部分