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,
If you want to run some operations in sequence on a background thread, you don't need lots of Task
s, you need just one:
Task.Factory.StartNew(DownloadAndInstallFiles)
And inside that Task
, you can use normal sequential control flow constructs, like foreach
and if
s to do what you want. Something like:
void DownloadAndInstallFiles()
{
foreach (var file in files)
{
var downloaded = Download(file, primarySource);
if (downloaded == null)
downloaded = Download(file, secondarySource);
if (downloaded != null)
Install(downloaded);
}
}