[英]How to determine if a Process has started but not yet exited?
我有一些代码可以创建一个Process实例,然后启动它。 有一些逻辑需要检查Process是否已经启动。 HasExited
可用于检查是否已退出已启动的进程,但我找不到HasStarted
的类似函数。 乍一看, StartTime
看起来是一个不错的选择,但是如果进程退出,这个函数将抛出。 此外,文档说StartTime
只对启动的进程有意义。
确定流程是否已启动(已启动但可能已退出)的“正确”方法是什么?
在Process.GetProcesses();
搜索您的流程Process.GetProcesses();
,此方法返回的列表提供当前在计算机上运行的所有进程。
虽然其他人建议的方法可行,但它并不是处理此类事情的最有效方法。 如果您保持循环检查进程是否已退出,则会浪费大量系统资源。 您应关注的是只知道流程何时退出,而不是坐下来检查流程是否已退出。 所以,正确的方法是处理事件。
下面的代码解释了如何使用事件来做到这一点。
// 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。 我更新了上面的代码,以显示如何轻松设置这样的标志。
您可以使用Process.GetProcesses
方法(在System.Diagnostics
命名空间中)获取当前在PC上运行的进程列表。
Process.GetProcessesByName()
也可用于获取特定程序的实例列表。
// Get all instances of Notepad running on the local computer.
Process [] localByName = Process.GetProcessesByName("YourProcess");
您可以检查过程中至少有一个线程 。 这表明该过程已启动并正在运行。
编辑:
您还可以检查进程ID 。 如果进程尚未启动,它将抛出异常。
编辑2:
实际上,如果没有设置Id, Threads也会抛出异常:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.