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

原文地址:https://www.cnblogs.com/fger/p/11438858.html

时间: 2024-10-15 22:53:31

1、控制器运行一个Process进程,等待不等待的问题的相关文章

nohup命令:以守护进程方式运行一个程序

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令.该命令可以在你退出帐户/关闭终端之后继续运行相应的进程.nohup就是不挂断的意思( no hang up). 该命令的一般形式为:nohup command & 使用nohup命令提交作业 如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件: nohup command > myout.file 2&

一个或多个音频服务未运行 win7 错误1079:此服务的账户不同于运行于同一进程上的其他服务账户

一个或多个音频服务未运行 win7 错误1079:此服务的账户不同于运行于同一进程上的其他服务账户 启动任务管理器:右键计算机——管理——”服务和应用程序“选项——”服务“——找到“windows audio”打开属性——“登录”选项——选择“此账户”——浏览——高级-立即查找-local sevice——确定(如果要输入密码的话,先清空再确定).再启动windows audio win7喇叭红叉耳机扬声器已拔出驱动无法修复 win7系统没声音,电脑驱动确实安装好了, 而且Windows 7系统

Vmware提示以独占方式锁定此配置文件失败。另一个正在运行的VMware进程可能正在使用配置文件

Vmware提示以独占方式锁定此配置文件失败.另一个正在运行的VMware进程可能正在使用配置文件以及虚拟机黑屏 解决办法: 以管理员方式打开cmd(必须),输入netsh winsock reset(这个命令是重置网络规范,黑屏的原因很可能就是VMware软件跟本地网络规范有冲突),回车之后提示成功重置winsock目录,您必须重新启动计算机才能重新完成配置.重启后打开即可. 原文地址:https://www.cnblogs.com/yuanlinghao/p/12657175.html

lab6:分析Linux内核创建一个新进程的过程

李俊锋 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验原理 1.进程的定义 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程. 2.进程与程序的区别 程序时静态的,它是一些保存 在磁盘上得指令的有序集合,没有任何执行的概念. 进程是一个动态的概念,它是程序执行的过程

《Linux内核分析》 第六节 分析Linux内核创建一个新进程的过程

范闻泽 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程 1.删除原来的menu,并clone新的menu,用test_fork.c覆盖test.c 2. make rootfs之后新的内核启动,测试fork功能 3.使用-s -S冷冻内核,准备调试 4.设置断点 5.根据断点,进行跟踪,得到结果 1.以下是执行指令 cd LinuxKernel rm menu -r

C# WinForm 判断程序是否已经在运行,且只允许运行一个实例

static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   static void Main()   {     Application.EnableVisualStyles();     Application.SetCompatibleTextRenderingDefault(false);     //1.这里判定是否已经有实例在运行     //只运行一个实

分析Linux内核创建一个新进程的过程【转】

转自:http://www.cnblogs.com/MarkWoo/p/4420588.html 前言说明 本篇为网易云课堂Linux内核分析课程的第六周作业,本次作业我们将具体来分析fork系统调用,来分析Linux内核创建新进程的过程 关键词:fork, 系统调用,进程 *运行环境:** Ubuntu 14.04 LTS x64 gcc 4.9.2 gdb 7.8 vim 7.4 with vundle 分析 分析方法说明 PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时

分析Linux内核创建一个新进程的过程

一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct{ volatile long state; //进程状态,-1表示不可执行,0表示可执行,大于1表示停止 void *stack; //内核堆栈 atomic_t usage; unsigned int flags; //进程标识符 unsigned int ptrace; …… } 2.进程的创

多次单击快捷方式,只运行一个程序实例

在应用程序安装之后,单击一次快捷方式,就运行一个程序实例,对于资源独占型程序来说,这样是不可以的,比如该程序使用了当前系统的某个端口,当同样的程序再次运行,再次试图占用同一个端口次,会提示"端口已经被占用的"异常.如此,必须在启动应用程序时,必须判断该程序是否已经有一个实例在运行.下面这个类中先判断该程序的实例有没有在运行,使用线程同步类EventWaitHandle(Boolean, EventResetMode, String)及注册正在等待 WaitHandle 的委托方法Reg