【发布时间】:2011-12-23 20:16:29
【问题描述】:
我必须依次运行 3 个进程,一个接一个。第二个过程必须在第一个过程完成后开始。 我在 C# 中工作。我使用了 Process.Start() 方法,它同时启动。 谁能帮帮我。
【问题讨论】:
-
请发布您当前的代码以及到目前为止您尝试过的代码。
我必须依次运行 3 个进程,一个接一个。第二个过程必须在第一个过程完成后开始。 我在 C# 中工作。我使用了 Process.Start() 方法,它同时启动。 谁能帮帮我。
【问题讨论】:
一种方法是为第一个进程的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)
【讨论】:
Process.Start("yourprogram.exe").WaitForExit();
Process.Start("yournextprogram.exe").WaitForExit();
等等……
【讨论】:
您可以通过响应 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();
}
【讨论】:
【讨论】:
如果您使用的是 .NET 4,则可以使用 System.Threading.Tasks API。如果您的图表变得更复杂,您可能会从http://pdag.codeplex.com 获得一些信息(我必须承认,这是我的工作)。
【讨论】:
您需要执行一个 process.join() 来等待第一个进程完成,然后再提交下一个。但是,更大的问题是为什么您使用 Process.Start() - 用于异步任务 - 当您实际上希望它们同步运行时?只是打电话:
a();
b();
c();
将一个接一个地运行它们。
【讨论】:
System.Diagnostics.Process NOT 有 Join() 方法。