【发布时间】:2016-09-17 10:20:20
【问题描述】:
有两个执行 On/Off 的任务,我想创建这些(对)的列表并并行执行它们。含义:每个Task都封装了TaskA和TaskB——TaskB总是等待TaskA先完成。所以我应该以并行执行TaskA/TaskB的“集合”来结束
任务 = {TaskA, TaskB} , {TaskA, TaskB}, {TaskA, TaskB} : 并行执行这 3 组任务
private static async Task TaskA()
{
await Task.Delay(2000);
Console.WriteLine("ended TaskA");
}
private static async Task TaskB()
{
await Task.Delay(2000);
Console.WriteLine("ended TaskB");
}
static void StartTask()
{
Task.Run(() =>
{
TaskA().Wait();
TaskB().Wait();
});
}
主要:
List<Task> tasks = new List<Task>();
int taskCount = 3;
for (var i = 0; i < taskCount; i++)
{
var task = new Task(StartTask);
tasks.Add(task);
}
Parallel.ForEach(tasks, task => task.Start());
目前我得到这个:
ended TaskA
ended TaskA
ended TaskA
ended TaskB
ended TaskB
ended TaskB
我相信输出应该是:
ended TaskA
ended TaskB
ended TaskA
ended TaskB
// etc..
另外,试过这个,但仍然是同样的问题:
static void StartTask()
{
Task task = TaskA().ContinueWith(x => TaskB().Wait(), TaskContinuationOptions.OnlyOnRanToCompletion);
}
编辑 1:
Parallel.For(1, taskCount, (i, state) =>
{
TaskA().ContinueWith(x => TaskB().Wait(), TaskContinuationOptions.OnlyOnRanToCompletion);
});
【问题讨论】:
-
为什么不直接从 taska 的末尾运行 taskb?
-
虽然我就是这么做的
-
私有静态异步任务 TaskA() { await Task.Delay(2000); Console.WriteLine("结束 TaskA");TaskB(); }
-
我无法修改 TaskA 或 TaskB。 TaskA 必须在 TaskB 开始之前完成
-
但是顺便说一下,当前的输出没有问题。因为你并行运行集合,A1、A2、A3 并行启动,当 A1 完成时,A2 和 A3 很可能也同时完成,那么你会看到 B1、B2 和 B3 并行启动。
标签: c# asp.net .net task-parallel-library