【问题标题】:How to start processes sequentially through code如何通过代码顺序启动进程
【发布时间】:2011-12-23 20:16:29
【问题描述】:

我必须依次运行 3 个进程,一个接一个。第二个过程必须在第一个过程完成后开始。 我在 C# 中工作。我使用了 Process.Start() 方法,它同时启动。 谁能帮帮我。

【问题讨论】:

  • 请发布您当前的代码以及到目前为止您尝试过的代码。

标签: c# process


【解决方案1】:

一种方法是为第一个进程的Exited 事件添加一个处理程序,然后从那里启动第二个进程。

void StartProcessOne() {
    Process p = Process.Start("foo", "bar");
    p.Exited += (sender, e) => StartProcessTwo();
    p.Start();
}

void StartProcessTwo() {
    Process p = Process.Start("foo2", "bar2");
    p.Exited += (sender, e) => StartProcessThree();
    p.Start();
}

...

您还可以使用WaitForExit() 方法,该方法会等待进程结束,然后再继续执行您的代码。但是请注意,这会使您自己的进程停止执行,直到另一个进程终止。这可能会给您留下一个无响应的用户界面等,这是非常不可取的。(source)

【讨论】:

  • 使用时应注意UI-Application进程,在某些情况下可以跳过进程退出,参见MSDN上的备注部分
  • 如果他有一个用户界面(我强烈怀疑),这种方法是不可取的,因为它会阻止所有用户输入,根据 MSDN。
【解决方案2】:
Process.Start("yourprogram.exe").WaitForExit();
Process.Start("yournextprogram.exe").WaitForExit();

等等……

【讨论】:

  • 与@Sebastian 的答案相同的问题在这里适用:这将阻止所有用户输入,这可能不是 OP 试图完成的。
  • @codesparkle 我回答了 OP 提出的问题,当您不知道比其他人更多的细节时,为什么要投反对票?您的方法可能也有效,但除非我们有更多详细信息,否则此代码没有任何问题。
  • 问题是上述场景在我能想到的几乎所有用例中都是不受欢迎的。即使它一个控制台应用程序,他也可能希望在运行进程时显示一些状态信息。
  • 好的,但我仍然认为应该为无益的答案保留反对票,这符合 OP 的要求......
【解决方案3】:

您可以通过响应 Process.Exited 事件来完成此操作。
您应该使用此方法而不是 WaitForExit(),因为后者会阻止您的程序响应用户输入等...

private int n = 0;

private void StartAProcess()
{
    Process process = new Process {
        StartInfo = {FileName = "cmd.exe", Arguments = "pause"}, 
        EnableRaisingEvents = true};
    process.Exited += process_Exited;
    process.Start();
    n++;
}

void process_Exited(object sender, EventArgs e)
{
    if (n < 3) StartAProcess();
}

【讨论】:

    【解决方案4】:

    为每个进程尝试此代码

    Process.WaitForExit()
    

    http://msdn.microsoft.com/en-us/library/aa326953(v=VS.71).aspx

    【讨论】:

      【解决方案5】:

      如果您使用的是 .NET 4,则可以使用 System.Threading.Tasks API。如果您的图表变得更复杂,您可能会从http://pdag.codeplex.com 获得一些信息(我必须承认,这是我的工作)。

      【讨论】:

        【解决方案6】:

        您需要执行一个 process.join() 来等待第一个进程完成,然后再提交下一个。但是,更大的问题是为什么您使用 Process.Start() - 用于异步任务 - 当您实际上希望它们同步运行时?只是打电话:

        a();
        b();
        c();
        

        将一个接一个地运行它们。

        【讨论】:

        • System.Diagnostics.Process NOTJoin() 方法。
        • OK - WaitForExit 代替。我应该检查一下。
        猜你喜欢
        • 2013-04-09
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        相关资源
        最近更新 更多