我有一个有点复杂的任务结构(至少对我来说)。结构是:
(其中 T = 任务)
T1,T2,T3...Tn。有一个数组(文件列表),T 代表为每个文件创建的任务。每个 T 始终有两个必须完成或失败的子任务:Tn.1、Tn.2 - 下载和安装。对于每次下载(Tn.1),总是有两个子任务要尝试,从两个路径(Tn.1.1,Tn.1.2)下载。
执行将是:
一、下载文件:Tn1.1。如果 Tn.1.1 失败,则 Tn.1.2 执行。如果任一下载任务返回 OK - 执行 Tn.2。如果 Tn.2 执行或失败 - 转到下一个 Tn。
我想第一件事就是用锯齿状数组编写所有这些结构:
private void CreateTasks()
{
//main array
Task<int>[][][] mainTask = new Task<int>[_queuedApps.Count][][];
for (int i = 0; i < mainTask.Length; i++)
{
Task<int>[][] arr = GenerateOperationTasks();
mainTask[i] = arr;
}
}
private Task<int>[][] GenerateOperationTasks()
{
//two download tasks
Task<int>[] downloadTasks = new Task<int>[2];
downloadTasks[0] = new Task<int>(() => { return 0; });
downloadTasks[1] = new Task<int>(() => { return 0; });
//one installation task
Task<int>[] installTask = new Task<int>[1] { new Task<int>(() => { return 0; }) };
//operations Task is jagged - keeps tasks above
Task<int>[][] operationTasks = new Task<int>[2][];
operationTasks[0] = downloadTasks;
operationTasks[1] = installTask;
return operationTasks;
}
所以现在我得到了我的 mainTask 任务数组,其中包含如上所述的有序任务。然而,在阅读有关 ContinuationTasks 的文档后,我意识到这对我没有帮助,因为我必须调用例如 Task.ContinueWith(Task2)。我很难在我的 mainTask 数组上这样做。我不能写 mainTask[0].ContinueWith(mainTask[1]) 因为我不知道数组的大小。
如果我能以某种方式引用数组中的下一个任务(但不知道它的索引),但无法弄清楚如何。有任何想法吗?非常感谢您的帮助。
问候,