如何在C#中管理同步和异步进程的混合?

如何在C#中管理同步和异步进程的混合?,c#,asynchronous,process,synchronization,C#,Asynchronous,Process,Synchronization,期望的结果: 定义同步和异步方法关系的组合 示例 假设有4种方法,每种方法都包含一个过程,其中: 在调用Method.ProcessA2(同步关系)之前,Method.ProcessA1必须启动并完成 在调用Method.ProcessB2(同步关系)之前,Method.ProcessB1必须启动并完成 Method.ProcessA和Method.ProcessB可以并行启动和完成(异步关系) 下面链接中显示的流程图更清楚地说明了所需的同步性。流程图如下所示: 这里有一个异步方法,也许在这里

期望的结果:

定义同步和异步方法关系的组合

示例

假设有4种方法,每种方法都包含一个过程,其中:

  • 在调用Method.ProcessA2(同步关系)之前,Method.ProcessA1必须启动并完成
  • 在调用Method.ProcessB2(同步关系)之前,Method.ProcessB1必须启动并完成
  • Method.ProcessA和Method.ProcessB可以并行启动和完成(异步关系)
  • 下面链接中显示的流程图更清楚地说明了所需的同步性。流程图如下所示:

    这里有一个异步方法,也许在这里使用它是合适的


    注意:我是SO的新手,愿意听取关于编写高质量问题的建议。

    您想做什么?这是相当抽象的。。。这可以归结为“如何同时运行两个异步方法”,还是我误读了它?(我不是反对者。不过,总的来说,在把这个问题带到这里之前,你似乎可以做更多的研究。)我基本上想做4件事,其中一些必须先于另一些,而另一些可以并行运行。更具体地说,我想做的事情包括调用多个命令行应用程序实例。您想做什么?这是相当抽象的。。。这可以归结为“如何同时运行两个异步方法”,还是我误读了它?(我不是反对者。不过,总的来说,在把这个问题带到这里之前,你似乎可以做更多的研究。)我基本上想做4件事,其中一些必须先于另一些,而另一些可以并行运行。更具体地说,我想做的事情包括调用命令行应用程序的多个实例。将在我的应用程序中试一试,但它表明您理解这个问题。事实证明,这种方法会导致编译错误。”ProcessA'和ProcessB'被声明为方法。但是,Task.Run()正在寻找“Action”作为参数。编译器错误为“CS1503参数1:无法从“方法组”转换为“操作”。操作是一种不返回值的方法,但我发现Task.Run存在重载,它接受任务,导致参数不明确。我编辑了答案以消除参数的歧义。这在.Net 4.6中运行。下面是一个来自Microsoft的示例。它建议将操作本身作为参数,而不是对方法调用Task.Run()。如果行动广泛,似乎有点混乱。匿名方法声明始终是一个选项,但在您的情况下,它会掩盖调用ProcessA的意图。清晰的意图在编程中是一个流行的想法,因为它使代码更具声明性,更易于维护。将在我的应用程序中试一试,但它表明您理解这个问题。事实证明,这种方法会导致编译错误。”ProcessA'和ProcessB'被声明为方法。但是,Task.Run()正在寻找“Action”作为参数。编译器错误为“CS1503参数1:无法从“方法组”转换为“操作”。操作是一种不返回值的方法,但我发现Task.Run存在重载,它接受任务,导致参数不明确。我编辑了答案以消除参数的歧义。这在.Net 4.6中运行。下面是一个来自Microsoft的示例。它建议将操作本身作为参数,而不是对方法调用Task.Run()。如果行动广泛,似乎有点混乱。匿名方法声明始终是一个选项,但在您的情况下,它会掩盖调用ProcessA的意图。清晰的意图在编程中是一个流行的想法,因为它使代码更具声明性,更易于维护。
    void ProcessA()
    {
        ProcessA1();
        ProcessA2();
    }
    
    void ProcessB()
    {
        ProcessB1();
        ProcessB2();
    }
    
    void LaunchProcesses()
    {
        Task aTask = Task.Run((Action)ProcessA); //You could also call use Task.Run(() => ProcessA());
        Task bTask = Task.Run((Action)ProcessB);
        aTask.Wait();
        bTask.Wait();
    }