2012-02-24 22:04:00|?次阅读|上传:wustguangh【已有?条评论】发表评论
C#项目进程需要结束外部进程,使用Process类的CloseMainWindow()方法可以通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程,使用Process类的Kill()方法立即停止关联的进程,本文将讨论他们的详细使用方法以及两者之间的区别和联系,读者可以根据实际需要选用合适的方案。
命名空间: System.Diagnostics
程序集: System(在 System.dll 中)
Process类提供的两种方法可以结束外部进程,本文将分别进行介绍,并且给出相应的源代码,读者可以选择适合自己的方案:
通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程。
函数原型:
public bool CloseMainWindow()
类型:System..::.Boolean
如果成功发送了关闭消息,则为 true;如果关联进程没有主窗口或禁用了主窗口(例如,如果当前显示模式对话框),则为 false。
备 注
执行进程时,其消息循环处于等待状态。每当操作系统向该进程发送 Windows 消息时,该消息循环执行。调用 CloseMainWindow 会向主窗口发送关闭请求,在一个格式良好的应用程序中,该请求会关闭子窗口并撤消此应用程序所有正在运行的消息循环。通过调用 CloseMainWindow 发出的退出进程的请求不强制应用程序退出。应用程序可以在退出前请求用户验证,也可以拒绝退出。若要强制应用程序退出,请使用 Kill 方法。CloseMainWindow 的行为与用户使用系统菜单关闭应用程序主窗口的行为一样。因此,通过关闭主窗口发出的退出进程的请求不强制应用程序立即退出。
如果调用 Kill,则可能丢失该进程编辑的数据或分配给该进程的资源。Kill 将导致进程不正常终止,因而只应在必要时使用。CloseMainWindow 使进程能够有序地终止并关闭所有窗口,因而对于拥有界面的应用程序,使用它更好。如果 CloseMainWindow 失败,则可以使用 Kill 终止进程。Kill 是终止没有图形化界面的进程的唯一方法。
只能对在本地计算机上运行的进程调用 Kill 和 CloseMainWindow。无法使远程计算机上的进程退出。仅可查看在远程计算机上运行的进程的信息。
示例:
/// <summary> /// 启动、结束进程测试程序 /// </summary> /// <param name="procName">进程名称</param> public void CloseProc(string procName) { try { Process myProcess; myProcess = Process.Start(procName); // Display physical memory usage 5 times at intervals of 2 seconds. for (int i = 0; i < 5; i++) { if (!myProcess.HasExited) { // Discard cached information about the process. myProcess.Refresh(); // Print working set to console. Console.WriteLine("Physical Memory Usage: " + myProcess.WorkingSet.ToString()); // Wait 2 seconds. Thread.Sleep(2000); } else { break; } } // Close process by sending a close message to its main window. myProcess.CloseMainWindow(); // Free resources associated with process. myProcess.Close(); } catch (Exception e) { Console.WriteLine("The following exception was raised: "); Console.WriteLine(e.Message); } }