代码之家  ›  专栏  ›  技术社区  ›  Shahar Shokrani

如何评估是否有任何未完成的并行任务,并等待他们完成几个sprint?

  •  0
  • Shahar Shokrani  · 技术社区  · 6 年前

    我有两个任务在完成两个阶段\冲刺之前无法完成,而 task1 在完成他的阶段有点快,应该等到下一个阶段开始 task2 结束。

    有没有一种优雅的方法允许向并行线程发出sprint完成通知?不分家

    接力赛 两个对手中的一个,但只有一个区别:每次第一个对手移动棍子时,他们都会等待另一个对手移动棍子,然后才继续。

    例子:

    public static void task1() 
    {
        Console.WriteLine("Start of sprint 1");
        //Need to wait for task2 to complete sprint1 and proceed.
        Console.WriteLine("End of sprint 1");
    
        Console.WriteLine("Start of sprint 2");
        //Need to wait for task2 to complete sprint2 and proceed.
        Console.WriteLine("End of sprint 2");
    
        //etc... sprint N
    }
    
    public static void task2()
    {
        Console.WriteLine("Start of sprint 1");
        Thread.Sleep(2000);
        Console.WriteLine("End of sprint 1");
    
        Console.WriteLine("Start of sprint 2");
        Thread.Sleep(2000);
        Console.WriteLine("End of sprint 2");
    
        //etc... sprint N
    }
    
    //Main thread:
    var task1 = Task.Factory.StartNew(Task1);
    var task2 = Task.Factory.StartNew(Task2);
    
    //wait for task1 and task2 to be finished with waitAll(new[] {task1, task2})...
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Shahar Shokrani    6 年前

    最后使用了 Barrier 班级。

    MSDN

    屏障是一个用户定义的同步原语,用于 分阶段算法。。。

    基本用法:

    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)");   
    }