C# 如何评估是否有任何未完成的并行任务,并等待他们完成两次冲刺?
我有两个任务要在完成两个阶段\sprint后才能完成,而C# 如何评估是否有任何未完成的并行任务,并等待他们完成两次冲刺?,c#,multithreading,C#,Multithreading,我有两个任务要在完成两个阶段\sprint后才能完成,而task1完成阶段的速度不快,应该等到下一个阶段转到task2后才能完成 有没有一种优雅的方式允许向并行线程发出sprint完成通知?不需要将task1和task2分成许多小任务 说明 想想两个对手的接力赛,但只有一个区别:每次第一个对手移动棍子时,他们都会等待另一个对手移动棍子,然后才继续 例子: 最后使用了屏障类 定义: 屏障是用户定义的同步原语,用于启用 多个线程(称为参与者)在一个 分阶段的算法 基本用法: 然后,每次我们都希望快速
task1
完成阶段的速度不快,应该等到下一个阶段转到task2
后才能完成
有没有一种优雅的方式允许向并行线程发出sprint完成通知?不需要将task1
和task2
分成许多小任务
说明
想想两个对手的接力赛,但只有一个区别:每次第一个对手移动棍子时,他们都会等待另一个对手移动棍子,然后才继续
例子:
最后使用了
屏障
类
定义:
屏障是用户定义的同步原语,用于启用
多个线程(称为参与者)在一个
分阶段的算法
基本用法:
然后,每次我们都希望快速任务等待慢速任务,我们只是添加:
barrier.SignalAndWait();
例子:
@Archer如果我只使用了
WaitAll
,那么task1
sprint2将立即开始,我希望它等到task2
sprint1结束。我现在明白了。我认为你需要把你的任务分成更小的部分。你可以按你的要求去做,但只创建更小、更简洁的任务要容易得多。@Archer我明白了,我想避免将任务划分为更小的任务,这会使代码更难理解和维护。也许你应该使用continuation?=>如果它们是单独的任务,那么您应该将它们分割为单独的任务,而不是尝试将其中一些任务分组。我个人认为,4个不同的函数比2个并排运行、互相等待的函数更清晰。
static barrier = new Barrier(N, (sprint) => { Console.WriteLine($"Current sprint: {sprint.CurrentPhaseNumber}");
barrier.SignalAndWait();
static Barrier barrier = new Barrier(2, (bar) =>
{
Console.WriteLine($"Current sprint number: {bar.CurrentPhaseNumber}.");
});
public static void task1()
{
Console.WriteLine("Start of sprint 1 (task1)");
barrier.SignalAndWait(); //Need to wait for task2 to complete sprint1 and proceed.
Console.WriteLine("End of sprint 1 (task1)");
Console.WriteLine("Start of sprint 2 (task1)");
barrier.SignalAndWait(); //Need to wait for task2 to complete sprint2 and proceed.
Console.WriteLine("End of sprint 2 (task1)");
}
public static void task2()
{
Console.WriteLine("Start of sprint 1 (task2)");
Thread.Sleep(2000);
barrier.SignalAndWait();
Console.WriteLine("End of sprint 1 (task2)");
Console.WriteLine("Start of sprint 2 (task2)");
Thread.Sleep(2000);
barrier.SignalAndWait();
Console.WriteLine("End of sprint 2 (task2)");
}