Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何评估是否有任何未完成的并行任务,并等待他们完成两次冲刺?_C#_Multithreading - Fatal编程技术网

C# 如何评估是否有任何未完成的并行任务,并等待他们完成两次冲刺?

C# 如何评估是否有任何未完成的并行任务,并等待他们完成两次冲刺?,c#,multithreading,C#,Multithreading,我有两个任务要在完成两个阶段\sprint后才能完成,而task1完成阶段的速度不快,应该等到下一个阶段转到task2后才能完成 有没有一种优雅的方式允许向并行线程发出sprint完成通知?不需要将task1和task2分成许多小任务 说明 想想两个对手的接力赛,但只有一个区别:每次第一个对手移动棍子时,他们都会等待另一个对手移动棍子,然后才继续 例子: 最后使用了屏障类 定义: 屏障是用户定义的同步原语,用于启用 多个线程(称为参与者)在一个 分阶段的算法 基本用法: 然后,每次我们都希望快速

我有两个任务要在完成两个阶段\sprint后才能完成,而
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)");   
}