少し複雑なタスク構造があります(少なくとも私にとっては)。構造は次のとおりです。
(T = タスク)
T1、T2、T3... Tn。配列 (ファイルのリスト) があり、T は各ファイルに対して作成されたタスクを表します。各 T には、完了するか失敗する必要がある 2 つのサブタスクが常にあります: Tn.1、Tn.2 - ダウンロードとインストール。各ダウンロード (Tn.1) には、2 つのパス (Tn.1.1、Tn.1.2) からのダウンロードを試行する 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 配列を取得しました。ただし、ContinueTasks のドキュメントを読んだ後、たとえば Task.ContinueWith(Task2) を呼び出す必要があるため、これは役に立たないことに気付きました。mainTask 配列でこれを行うことに困惑しています。配列のサイズがわからないので、mainTask[0].ContinueWith(mainTask[1]) と書けません。
配列内の次のタスクを何らかの方法で参照できた場合 (ただし、そのインデックスを知らなくても)、その方法がわかりません。何か案は?ご助力ありがとうございます。
よろしく、