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     ,这也是最终组合。

 

 说明:异步和多线程不是一个东西 
 
举个例子:控制器调用一个多线程处理的函数,虽然多线程是异步工作的,但是控制器不必等待立即返回的。
但是 控制器调用一个 具有异步的多线程,因为 async是配合await使用的,当作普通方法调用的方式,但是此函数也未执行完毕,就会导致控制器没有办法立即返回结果
 
二、关于 static 静态并发的问题

 

 求助技术老大给的指点:

 

 

 最终解决方案:用非静态类来处理的。

 之前还以为

我还以为,new里面的Task.Run会受到控制器的声明周期影响呢(即控制器返回后,Run不会在后台一直运行呢),发现并不会。我特别测试了一下,如何测试有误,请详细检测。

 

 

 

 

 

 

转载于:https://www.cnblogs.com/fger/p/11438858.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值