chaining array of tasks with continuation
- by Andrei Cristof
I have a Task structure that is a little bit complex(for me at least). The structure is:
(where T = Task)
T1, T2, T3... Tn. There's an array (a list of files), and the T's represent tasks created for each file.
Each T has always two subtasks that it must complete or fail: Tn.1, Tn.2 - download and install.
For each download (Tn.1) there are always two subtasks to try, download from two paths(Tn.1.1, Tn.1.2).
Execution would be:
First, download file: Tn1.1. If Tn.1.1 fails, then Tn.1.2 executes.
If either from download tasks returns OK - execute Tn.2.
If Tn.2 executed or failed - go to next Tn.
I figured the first thing to do, was to write all this structure with jagged arrays:
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;
}
So now I got my mainTask array of tasks, containing nicely ordered tasks just as described above. However after reading the docs on ContinuationTasks, I realise this does not help me since I must call e.g. Task.ContinueWith(Task2). I'm stumped about doing this on my mainTask array. I can't write mainTask[0].ContinueWith(mainTask[1]) because I dont know the size of the array.
If I could somehow reference the next task in the array (but without knowing its index), but cant figure out how.
Any ideas? Thank you very much for your help.
Regards,