2011-12-15 40 views
4

我已經搜索過,但無法在任何地方找到明確的確認......如果任務有多個延續(不是鏈式延續),那麼這些延續是否相互平行?任務的延續是否彼此異步運行?

我想運行task1,之後是task2-task3-task4並行到彼此,最後是task5完成之後。下面的例子。任務2,3和4是否會相互異步運行?

雖然我們在此,但任何改善模式的建議都是值得歡迎的。看起來有幾種不同的方法來完成這個組合。謝謝

public Task MyWorkflowAsync() { 
    Task task1 = Task.Factory.StartNew(() => DoTask1()); 

    var tarray = new Task[] { 
    task1.ContinueWith(task => DoTask2()), 
    task1.ContinueWith(task => DoTask3()), 
    task1.ContinueWith(task => DoTask4()) 
    }; 

    return Task.Factory.ContinueWhenAll(tarray, completedTasks => DoTask5()); 
} 

回答

3

不,繼續是在默認調度程序的LIFO排序中執行的。如果你想讓它們全部平行運行,你應該這樣做:

public Task MyWorkflowAsync() 
{ 
    var tasks = new List<Task>(); 
    var task1 = Task.Factory.StartNew(DoTask1); 

    tasks.Add(task1.ContinueWith(task => tasks.Add(Task.Factory.StartNew(DoTask2)))); 
    tasks.Add(task1.ContinueWith(task => tasks.Add(Task.Factory.StartNew(DoTask3)))); 
    tasks.Add(task1.ContinueWith(task => tasks.Add(Task.Factory.StartNew(DoTask4)))); 

    return Task.Factory.ContinueWhenAll(tasks.ToArray(), completedTasks => DoTask5()); 
} 
+0

Yuck。不是我希望的答案:-)我可以看到爲什麼需要添加內部DoTasks,但爲什麼還需要添加外部ContinueWith任務?在你的例子中,任務最終有6個成員而不是3個,這是正確的嗎? – nmarler 2011-12-15 20:37:35