2017-08-29 75 views
0

我有以下代碼:TPL內任務

List<Task> tasks = new List<Task>(); 

tasks.Add(Task.Factory.StartNew(() => 
{ 
    rs1.Process(); 
}).ContinueWith((previousTask) => 
{ 
    rs5.Process(); 
    rs6.Process(); 
})); 

tasks.Add(Task.Factory.StartNew(() => 
{ 
    rs2.Process(); 
})); 

tasks.Add(Task.Factory.StartNew(() => 
{ 
    rs3.Process(); 
})); 

try 
{ 
    Task.WaitAll(tasks.ToArray()); 
} 
catch (AggregateException e) 
{ 
} 

時rs1.Process飾面()rs5.Process()和rs6.Process()運行同步。我如何以異步方式運行它們。

如果我使用內部的任務,他們沒有被期待已久的

+0

這些不是「內部任務」,它們是延續。嘗試'... ContinueWith(async(previousTask)=> {await Task.Run(()=> rs5.Process());等待Task.Run(()=> rs6.Process())})); '或者類似的東西。 – Fildor

+0

That does not compile – pantonis

+0

我沒有測試它,你可能不得不改變它來編譯它。這只是爲了得到這個想法。 – Fildor

回答

0

您需要的內部任務列表:

tasks.Add(Task.Factory.StartNew(() => 
{ 
    rs1.Process(); 
}).ContinueWith((previousTask) => 
{ 
    List<Task> loInnerTasks = new List<Task>(); 
    loInnerTasks.Add(Task.Run(() => rs5.Process())); 
    loInnerTasks.Add(Task.Run(() => rs6.Process())); 
    Task.WaitAll(loInnerTasks.ToArray()); 
})); 

UPDATE(與TaskCreationOptions.AttachedToParent):

tasks.Add(Task.Factory.StartNew(() => 
{ 
    rs1.Process(); 
}).ContinueWith((previousTask) => 
{ 
    Task.Factory.StartNew(() => rs5.Process(), TaskCreationOptions.AttachedToParent); 
    Task.Factory.StartNew(() => rs6.Process(), TaskCreationOptions.AttachedToParent); 
})); 

例外也應該抓住在兩個方面。

+1

如果您將兩個inners任務附加到父任務,我認爲它更好https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/attached-and-detached-child-tasks – pantonis

+1

使用'TaskCreationOptions.AttachedToParent'時,您不需要內部列表。但將內部任務添加到外部列表沒有任何意義。 – PinBack