2011-01-31 51 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的備註部分