2012-03-15 77 views
4

我有一些代码可以创建一个Process实例并在以后启动它。有一些逻辑需要检查Process是否已经启动。 HasExited可用于检查已启动的进程是否已退出,但我找不到HasStarted的类似功能。乍一看StartTime看起来像一个不错的选择,但如果进程退出,此函数将抛出。另外,文档中说StartTime仅对已启动的进程有意义。如何确定进程是否已启动但尚未退出?

什么是“正确”的方法来确定过程是否已经开始(已经开始,但可能已经退出)?

+0

可能重复[如何知道某个进程是否正在运行?](http://stackoverflow.com/questions/262280/how-can-i-know-if-a-process-is-running) – 2012-03-15 13:06:42

+0

稍微改变了这个问题,以更好地反映我在问一个过程是否已经开始(它可能已经退出)。 – larsmoa 2012-03-15 13:53:04

+0

也改变了标题... – 2012-03-15 16:27:38

回答

6

尽管其他人建议的方法可行,但它并不是处理此类事情的最有效方法。如果您保持循环检查Process是否退出,您将浪费大量系统资源。 您的关注点应该是知道流程何时退出,而不是坐在循环中检查流程是否已退出。所以,正确的方法是处理事件。

下面的代码解释了如何使用事件来完成该操作。

// Declare your process object with WithEvents, so that events can be handled. 
private Process withEventsField_MyProcess; 
Process MyProcess { 
    get { return withEventsField_MyProcess; } 
    set { 
     if (withEventsField_MyProcess != null) { 
      withEventsField_MyProcess.Exited -= MyProcess_Exited; 
     } 
     withEventsField_MyProcess = value; 
     if (withEventsField_MyProcess != null) { 
      withEventsField_MyProcess.Exited += MyProcess_Exited; 
     } 
    } 
} 

bool MyProcessIsRunning; 
private void Button1_Click(System.Object sender, System.EventArgs e) 
{ 
    // start the process. this is an example. 
    MyProcess = Process.Start("Notepad.exe"); 

    // enable raising events for the process. 
    MyProcess.EnableRaisingEvents = true; 

    // set the flag to know whether my process is running 
    MyProcessIsRunning = true; 
} 

private void MyProcess_Exited(object sender, System.EventArgs e) 
{ 
    // the process has just exited. what do you want to do? 
    MyProcessIsRunning = false; 
    MessageBox.Show("The process has exited!"); 
} 

编辑: 知道该进程是否已经启动或正在以来在某处的代码启动过程不应该很容易。所以你可以在那里设置一个标志并在进程退出时将它设置为false。我更新了上面的代码,以显示如何轻松设置这样的标志。

+0

刚刚意识到这个问题是针对C#发布的,而我却把它误认为VB。现在我已经用C#代替了上面的代码。 – 2012-03-15 14:25:49

+1

+1关于使用事件。它效率更高。像往常一样好的代码Pradeep :) – 2012-03-15 15:12:09

+1

使用事件来确定进程何时退出是一种很好的方法。然而,它不确定该过程是否已经开始。在多线程环境中,当进程实例正在运行时,MyProcessIsRunning可能为false。 – 2012-03-15 16:33:39

6

Process.GetProcesses();中搜索您的进程,此方法返回的列表给出了机器上当前正在运行的所有进程。

2

您可以检查过程中是否有至少一个thread。这将表明该过程已启动并正在运行。

编辑:
你也可以查看进程Id。如果过程尚未开始,它将引发异常。

编辑2:
其实Threads也将抛出如果Id没有设置一个例外:

bool ProcessIsRunning(Process p) 
{ 
    bool isRunning; 
    try { 
    isRunning = !p.HasExited && p.Threads.Count > 0; 
    } 
    catch(SystemException sEx) 
    { 
    isRunning = false; 
    } 
    catch(PlatformNotSupportedException pnsEx) 
    { 
    throw; 
    } 

    return isRunning; 
} 
+0

p.HasExited如果没有启动,将会抛出异常。 – user99999991 2016-09-28 22:51:42

2

可以使用Process.GetProcesses方法(在System.Diagnostics 命名空间)来获取列表当前在PC上运行的进程。

Process.GetProcessesByName()也可以用来获取特定程序的 实例列表。

// Get all instances of Notepad running on the local computer. 
Process [] localByName = Process.GetProcessesByName("YourProcess"); 
相关问题