1控制器运行一个Process进程,等待不等待的问题

Posted fger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1控制器运行一个Process进程,等待不等待的问题相关的知识,希望对你有一定的参考价值。

一、区别

技术图片

 

 

 

        public static async void Execute(string para, string ffmpegPath, string timestr, string Id, string targetUrl)
        
           await Task.Run(() =>
            
                CreTimeStr = timestr;
                rowId = Id;
                compPath = targetUrl;
                Process p = new Process();
                p.StartInfo.FileName = ffmpegPath;
                p.StartInfo.Arguments = para;  //执行参数
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中
                p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
                p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
                using (p)
                
                    p.Start();
                    p.BeginErrorReadLine();//开始异步读取
                    p.WaitForExit();//阻塞等待进程结束
                    p.Close();//关闭进程
                
            );
        

上面的方式 async 方法必须配合 await  ,导致 Task.Run 中的技术图片

 

 一直运行,哪怕

技术图片

 提前return也无效。

 最终去掉完美解决:

技术图片

 二、扩展当我们需要返回值(因为没有等待,所以未及时计算出,代码继续往下执行)--此方式完全没有任何意义,这样做。

技术图片

 

 技术图片

 三、扩展-当我们需要等待的时候就用 await 但是 就必须配合async了 

 技术图片

 但是 await 后面配合必须是异步的方法,就出现 Task.Run     ,这也是最终组合。

 

以上是关于1控制器运行一个Process进程,等待不等待的问题的主要内容,如果未能解决你的问题,请参考以下文章

启动过程 - 等待不工作

进程同步 (Process Synchronization)

03process对象的其他方法属性

编发编程(Process对象的join方法)

等待 OTP 进程退出

Process对象的其它方法与属性(join)