Process.EnableRaisingEvents 属性
获取或设置在进程终止时是否应激发 Exited 事件。
命名空间: System.Diagnostics
程序集: System(在 System.dll 中)
EnableRaisingEvents 属性指示在操作系统关闭进程时是否通知该组件。 EnableRaisingEvents 属性用于在异步处理中向应用程序通知进程已退出。 若要强制应用程序同步等待退出事件(它一直中断应用程序的处理,直到退出事件发生为止),请使用 WaitForExit 方法。
说明 |
---|
如果正在使用 Visual Studio 并且双击了您的项目中的 Process 组件,则将自动生成 Exited 事件委托和事件处理程序。 附加代码将 EnableRaisingEvents 属性设置为 false。 必须将此属性更改为 true,以便在关联进程退出时执行您的事件处理程序。 |
当关联的进程在被操作系统关闭(通过正常或不正常终止)后退出时,操作系统便通知与该进程关联的每个进程组件(只要该组件的 EnableRaisingEvents 值为 true)。 如果某个组件启动该进程,则该组件可访问关联进程的管理信息,操作系统仍存储这些信息。 此类信息包括 ExitTime 和 ExitCode。
关联的进程退出后,组件的 Handle 不再指向现有进程资源。 相反,它仅可用于访问有关进程资源的操作系统信息。 操作系统知道 Process 组件尚未释放已退出进程的若干句柄,所以它在内存中保存 ExitTime 和 Handle 信息。
监视进程的退出是有成本的。 如果 EnableRaisingEvents 为 true,则关联进程终止时将激发 Exited 事件。 此时,您为 Exited 事件指定的过程将运行。
有时,应用程序启动了一个进程,但不需要将进程的关闭通知给应用程序。 例如,应用程序可启动“记事本”,以便用户执行文本编辑,但不必将“记事本”应用程序另作它用。 可以选择在进程退出时不通知,因为该进程与应用程序的继续运行不相关。 将 EnableRaisingEvents 设置为 false 可节省系统资源。
下面的代码示例创建打印文件的进程。 对 EnableRaisingEvents 属性进行设置,以便在该进程退出时使该进程引发 Exited 事件。 Exited 事件处理程序将显示进程信息。
using System; using System.Diagnostics; using System.Threading; class PrintProcessClass { private Process myProcess = new Process(); private int elapsedTime; private bool eventHandled; // Print a file with any known extension. public void PrintDoc(string fileName) { elapsedTime = 0; eventHandled = false; try { // Start a process to print a file and raise an event when done. myProcess.StartInfo.FileName = fileName; myProcess.StartInfo.Verb = "Print"; myProcess.StartInfo.CreateNoWindow = true; myProcess.EnableRaisingEvents = true; myProcess.Exited += new EventHandler(myProcess_Exited); myProcess.Start(); } catch (Exception ex) { Console.WriteLine("An error occurred trying to print \"{0}\":" + "\n" + ex.Message, fileName); return; } // Wait for Exited event, but not more than 30 seconds. const int SLEEP_AMOUNT = 100; while (!eventHandled) { elapsedTime += SLEEP_AMOUNT; if (elapsedTime > 30000) { break; } Thread.Sleep(SLEEP_AMOUNT); } } // Handle Exited event and display process information. private void myProcess_Exited(object sender, System.EventArgs e) { eventHandled = true; Console.WriteLine("Exit time: {0}\r\n" + "Exit code: {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime); } public static void Main(string[] args) { // Verify that an argument has been entered. if (args.Length <= 0) { Console.WriteLine("Enter a file name."); return; } // Create the process and print the document. PrintProcessClass myPrintProcess = new PrintProcessClass(); myPrintProcess.PrintDoc(args[0]); } }
- LinkDemand
用于完全信任直接调用方。 此成员不能由部分信任的代码使用。
Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)
.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。