异步获取进程输出信息,控制其他线程的操作

问题描述: 
我的项目需要将3个文件压缩成rar文件,其中包括动态生成的1.swf、1.mp3文件还有另一个较大的2.mp3文件。

已确定的两个基本步骤是

1.进程对象1调用rar.exe压缩生成自动运行1.swf的自解压文件1.exe。

2. 进程对象2再次调用rar.exe将1.exe文件压缩成1.rar文件。(主要为了能够作为安全附件发送)


现在有这样一个问题,如果2.mp3文件过大,会造成用于生成的1.exe的Process实例p1还没有运行完毕,第二个Process实例p2就开始了,致使1.rar无法生成或生成失败。

开始我试了根据mp3的体积来动态加入线程延迟Thread.Sleep(n)来延迟p2的Start()调用,可是并不很理想,这样毕竟不是很准确。

那么有没有好的办法,可以得到P1运行完毕的状态,再开始运行P2呢?

答案是肯定的,我们可以获取进程输出信息流,然后根据它的信息来进一步控制处理其他线程的操作。

根据msdnhttp://msdn.microsoft.com/zh-cn/vstudio/system.diagnostics.process.beginoutputreadline.aspx

我们知道调用外部程序的进程输出信息有异步和同步两种方式。

同步和异步两种方式都做了测试都可以实现我的需求,同步方式的代码已作注释

下例中代码分别为进程_ExeProcess和_RarProcess注册委托方法ExeOutputHandler和RarOutputHandler。分别负责获取进程OutputDataReceived时的输出信息,在调用BuileExe()的委托线程执行后才执行调用BuildRar()的委托线程。其中RarOutputHandler中还负责控制_isDone的全局状态。这样客户端就可以根据IsDone属性来已经启动压缩程序的控制应用程序何时可以退出。

 

Code

 

 

 

posted @ 2009-06-23 14:01  LutzMark  阅读(879)  评论(1编辑  收藏  举报