[英]execute pair of tasks in Parallel
有两个执行On / Off的任务,我想创建这些(对)的列表并并行执行。 含义: 每个Task封装TaskA和TaskB - TaskB始终等待TaskA首先完成 。 因此,我应该最终并行执行TaskA / TaskB的“设置”
Task = {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);
});
我相信输出应该是:...
不,那不是“平行”的意思。 如果您打算开始三对,那么我希望您已经看到了输出。
就是说,代码中有些东西没有意义。 首先,区分“并行”(多个线程)和“并行”(同时执行多个操作)。 看起来您的任务自然是异步的,因此让我们使用异步编程而不是线程来重写代码:
Wait
替换为await
。 Task.Run
。 将TaskA
和TaskB
成一个新的“配对任务”会更容易:
static async Task PairTaskAsync()
{
await TaskA();
await TaskB();
}
现在,您只想同时运行其中的三个“配对任务”。 旧代码使用任务构造函数,然后并行化启动任务-即使我们要进行并行化,这也是完全错误的。 我们不 我们想要异步并发。
异步并发通常通过Task.WhenAll
实现:
List<Task> tasks = new List<Task>();
int taskCount = 3;
for (var i = 0; i < taskCount; i++)
tasks.Add(PairTaskAsync());
await Task.WhenAll(tasks);
或者,为了最大程度地简洁:
await Task.WhenAll(Enumerable.Range(0, 3).Select(_ => PairTaskAsync()));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.