分类:
2008-10-13 16:56:59
Process是.NET Framework提供给我们用于进程管理的一个类,并以组件的形式放在了VC#.NET IDE的工具箱中。下面以实际的代码演示如何实现父进程等待子进程退出的功能(代码已做大量简化)
//在构造子中初始化Process对象与IsLoaded
Process processSub = new Process();
bool IsLoaded = false;
public bool LoadSubProcess()
{
//使用非静态的Start(),才能建立进程间的父子关系
processSub.StartInfo.FileName = PLocation;
//设置进程结束时的回调方法,this是父进程的窗口对象
processSub.SynchronizingObject = this;
processSub.Exited += new EventHandler(ExitHandler);
processSub.EnableRaisingEvents = true;
processSub.Start();
//子进程已被装载标志
IsLoaded = true;
return true;
}
//当进程结束时,会回调这个方法,此时置IsLoaded为false
private void ExitHandler(object sender, System.EventArgs e)
{
processSub.Close();
IsLoaded = false;
}
//在主进程窗口类的Application.Idle事件中检查子进程是否已经关闭
private void MainForm_Idle(object sender, System.EventArgs e)
{
//当然判断条件不可能如此简单,否则IsLoaded在对象构造时为false
if (!IsLoaded))
{
//这里加上子进程退出后父进程想要做的事
;
}
return;
}
2007-3-20修订
考虑到上述实现方式中,子线程对象需要保存一个对父线程对应的Form对象的引用,而且需要添加一个IsLoaded标志进行判断,略显累赘,所以在回顾了《》一文的方法后,参考文中的实现方式,将上例改为:
1. 利用主线程的BeginInvoke()以异步方式调用启动子线程的方法,即本例中的LoadSubProcess(),并为之设置一个回调方法Callback();
2. 在LoadSubProcess()内部,不再设置其回调方法,而是利用Process.WaitForExit()进入无限循环等待,等Process对应的进程结束后,在WaitForExit()之后紧接调用Process.Close();
3. 当子线程结束后,Callback()被调用,我们接着在Callback()中去做其余类似更新界面等工作。
这样的方式,比我原来采用的方式更符合语境逻辑,适合在分层的系统中使用。
posted on 2004-08-22 10:25 Abbey的小匣子 阅读(1217)