【发布时间】:2012-07-01 20:38:39
【问题描述】:
我有一个有点复杂的任务结构(至少对我来说)。结构是:
(其中 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]) 因为我不知道数组的大小。
如果我能以某种方式引用数组中的下一个任务(但不知道它的索引),但不知道如何。 有任何想法吗?非常感谢您的帮助。
问候,
【问题讨论】:
-
您不会将
Task与另一个已经创建的Task一起继续。相反,ContinueWith()接受一个委托并返回延续Task。 -
另外,我完全不明白你为什么要使用
Tasks。您描述的工作流程是完全同步的,您不需要Tasks。 -
感谢您的澄清,svick。我使用任务是因为有人建议我在这里这样做:stackoverflow.com/questions/11145938/…。如果不是任务,您能否建议我还可以使用什么来完成我提到的行为?一种在单独线程上处理一组操作并在执行结束时获取结果/失败列表的机制。谢谢
标签: .net c#-4.0 task-parallel-library continuations