工作。当然,你可以把WaitForExit放在另一个线程中,这样你的主线程就不会被阻塞。
下面是一个例子,而不是使用一个单独的线程
Process[] processes = Process.GetProcessesByName("notepad");
if (processes.Length > 0)
{
processes[0].WaitForExit();
}
下面是一个简单的版本使用线程来监视过程。
public static class ProcessMonitor
{
public static event EventHandler ProcessClosed;
public static void MonitorForExit(Process process)
{
Thread thread = new Thread(() =>
{
process.WaitForExit();
OnProcessClosed(EventArgs.Empty);
});
thread.Start();
}
private static void OnProcessClosed(EventArgs e)
{
if (ProcessClosed != null)
{
ProcessClosed(null, e);
}
}
}
以下控制台代码是如何使用以上控制台代码的示例。当然,这在WPF或WinForms应用中同样适用,但请记住,对于UI,您无法直接从事件回调更新UI,因为它在UI线程的单独线程中运行。在这里有很多关于stackoverflow的例子来解释如何从非UI线程更新WinForms和WPF的UI。
static void Main(string[] args)
{
// Wire up the event handler for the ProcessClosed event
ProcessMonitor.ProcessClosed += new EventHandler((s,e) =>
{
Console.WriteLine("Process Closed");
});
Process[] processes = Process.GetProcessesByName("notepad");
if (processes.Length > 0)
{
ProcessMonitor.MonitorForExit(processes[0]);
}
else
{
Console.WriteLine("Process not running");
}
Console.ReadKey(true);
}
WaitForExit steel使用轮询 – 2010-11-07 18:59:14
@SaeedAlg,WaitForExit在进程的WaitHandle上调用WaitOne,通常它是ProcessWaitHandle的一个实例。因此,基本上使用等待进程句柄的操作系统功能在进程关闭时发出信号。 – 2010-11-07 19:06:51
嗨克里斯感谢这一点我是新来的C#,迄今为止避免使用多个线程!猜我现在需要看看... 任何机会,我会如何在另一个线程上做这件事,并提出一个事件... – Adrian 2010-11-07 19:11:28