我有一些代码可以创建一个Process实例,然后启动它。有一些逻辑需要检查Process是否已经启动。 HasExited
可用于检查是否已退出已启动的进程,但我找不到HasStarted
的类似函数。乍一看StartTime
看起来是一个不错的选择,但是如果进程已退出,则此函数将抛出。此外,文档说StartTime
仅对启动的进程有意义。
确定流程是否已启动(已启动但可能已退出)的“正确”方法是什么?
答案 0 :(得分:6)
在Process.GetProcesses();
中搜索您的流程,此方法返回的列表会提供当前在计算机上运行的所有流程。
答案 1 :(得分:6)
虽然其他人建议的方法可行,但它并不是处理此类事情的最有效方法。如果您保持循环检查进程是否已退出,则会浪费大量系统资源。 您应关注的是只知道流程何时退出,而不是坐下来检查流程是否已退出。所以,正确的方法是处理事件。
下面的代码说明了如何使用事件。
// 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。我更新了上面的代码,以显示如何轻松设置这样的标志。
答案 2 :(得分: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;
}
答案 3 :(得分:2)
您可以使用Process.GetProcesses
方法(在System.Diagnostics
中
命名空间)获取当前在PC上运行的进程列表。
Process.GetProcessesByName()
也可用于获取列表
特定程序的实例。
// Get all instances of Notepad running on the local computer.
Process [] localByName = Process.GetProcessesByName("YourProcess");