簡體   English   中英

TPL內部任務

[英]TPL inner tasks

我有以下代碼:

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 finish()時rs5.Process()和rs6.Process()同步運行。 我如何異步運行它們。

如果我使用內部任務,就不會等待它們

您需要一個內部任務列表:

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());
}));

更新(使用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);
}));

異常也應以兩種方式捕獲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM