C# - 制作Process.Start等到进程启动

Tom*_*Tom 72 .net c# windows process

在继续使用方法之前,我需要确保进程正在运行.

声明是:

Process.Start("popup.exe");
Run Code Online (Sandbox Code Playgroud)

你可以做一个WAIT命令或者设置这个值的延迟吗?

jas*_*son 128

你的意思是等到它完成了吗?然后使用Process.WaitForExit:

var process = new Process {
    StartInfo = new ProcessStartInfo {
        FileName = "popup.exe"
    }
};
process.Start();
process.WaitForExit();
Run Code Online (Sandbox Code Playgroud)

或者,如果它是一个具有您正在等待进入消息循环的UI的应用程序,您可以说:

process.Start();
process.WaitForInputIdle();
Run Code Online (Sandbox Code Playgroud)

最后,如果这些都不适用,只Thread.Sleep需要一段合理的时间:

process.Start();
Thread.Sleep(1000); // sleep for one second
Run Code Online (Sandbox Code Playgroud)

  • 只要确保你了解WaitForInputIdle实际上做了什么http://blogs.msdn.com/b/oldnewthing/archive/2010/03/25/9984720.aspx (9认同)

小智 15

我也需要这个,我检查了流程的窗口标题.如果它是您期望的那个,您可以确定应用程序正在运行.我正在检查的应用程序需要一些时间来启动,这种方法对我来说很好.

var process = Process.Start("popup.exe");
while(process.MainWindowTitle != "Title")
{
    Thread.Sleep(10);
}
Run Code Online (Sandbox Code Playgroud)


Ali*_*deh 12

'ChrisG'的答案是正确的,但我们每次都需要刷新MainWindowTitle,最好检查一下空....这样:

var proc = Process.Start("popup.exe");
while (string.IsNullOrEmpty(proc.MainWindowTitle))
{
    System.Threading.Thread.Sleep(100);
    proc.Refresh();
}
Run Code Online (Sandbox Code Playgroud)

  • 我们是否可以假设命令行应用程序一旦获得标题就启动了? (2认同)

小智 8

首先:我知道这已经很老了,但仍然没有接受的答案,所以也许我的方法会帮助其他人.:)

我做的是解决这个问题:

process.Start();

while (true)
{
    try
    {
        var time = process.StartTime;
        break;
    }
    catch (Exception) {}
}
Run Code Online (Sandbox Code Playgroud)

var time = process.StartTime只要进程没有启动,关联就会抛出异常.因此,一旦通过,就可以安全地假设流程正在运行并进一步使用它.我正在使用它来等待java进程启动,因为它需要一些时间.这样它应该独立于应用程序运行的机器而不是使用Thread.Sleep().

我知道这不是一个非常干净的解决方案,但是我能想到的唯一应该是性能独立的解决方案.


Mat*_*att 7

就像其他人已经说过的那样,你所要求的并不是很明显.我将假设你想要启动一个进程,然后在进程"准备就绪"时执行另一个操作.

当然,"准备就绪"是棘手的.根据您的需求,您可能会发现只需等待即可.但是,如果您需要更强大的解决方案,可以考虑使用命名的Mutex来控制两个进程之间的控制流.

例如,在主进程中,您可以创建一个命名的互斥锁并启动一个等待的线程或任务.然后,您可以开始第二个过程.当该进程决定"它已准备就绪"时,它可以打开指定的互斥锁(当然,您必须使用相同的名称)并向第一个进程发出信号.


Fra*_*son 5

我同意汤姆的观点。此外,要在执行 Thread.Sleep 时检查进程,请检查正在运行的进程。就像是:

bool found = 0;
while (!found)
{
    foreach (Process clsProcess in Process.GetProcesses())
        if (clsProcess.Name == Name)
            found = true;

    Thread.CurrentThread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

  • `while (!Process.GetProcesses().Any(p=>p.Name == myName)) { Thread.Sleep(100); } }` (2认同)