微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

等待外部过程完成

我有一个调用方法,虽然我想在方法完成后显示消息框(现在消息框在调用方法后直接显示):

if (Check == true) { StartConvIpod(); } else { } MessageBox.Show("Operation Successful!");

StartConvIpod:

private void StartConvIpod() { string res = Directory.EnumerateFiles("dump"). OrderBy(x => File.GetCreationTime(x)).Last(); string sub = res.Substring(5); string sub2 = sub.Substring(0,sub.Length - 4); Process p = new Process(); p.StartInfo.WorkingDirectory = "dump"; p.StartInfo.FileName = "ffmpeg.exe"; p.StartInfo.Arguments = "-i " + sub + " -f mp4 -vcodec mpeg4 -b 700k -aspect 4:3 -r 23.98 -s 320x240 -acodec ac3 -ar 48000 iPodConversions\" + sub2 + ".mp4"; p.Start(); }

使用oracle.dataaccess.dll时出错

如何测量文件(硬盘)I / O的特性?

在Linux下,C#程序在单声道下不起作用。

如何在Web应用程序中设置主题

在.NET中编写虚拟打印机

防止对象被分页(VirtualLock相当于)

.NET:如何使用临时文件名传递命令行参数

如何使用WinAPI以快速方式逐个像素地处理图像?

Linq to sql – 如何对查询结果进行sorting

重新启动一个应用程序本身

在你的代码的末尾使用这个:

p.WaitForExit();

不要忘记检查它的返回值,以确保它实际上是成功的,但是:

if(p.ExitCode == 0) { // Or whatever return code you're expecting //... }

你会想添加这个:

p.Start(); p.WaitForExit(); // or p.WaitForExit(Timeout-Period-In-Milliseconds);

你有几个选择。 在StartConvIpod ,可以在p.WaitForExit()之后p.Start();

这将工作,但可能会阻止你的用户界面线程(使其看起来你的应用程序被冻结)。 相反,我会改变你的用户界面到某种“工作”状态,如禁用“开始转换”按钮,并将标签设置为“转换”(就像一个例子)。 然后我会在p.Exited事件上注册,当你的程序退出。 当事件发生时,您可以通知UI您的转换已完成,并检查过程中的退出代码

根据Process Exit Event的MSDN文档使用Process.Exited事件,轮询30秒,直到Exited事件触发并检查ExitCode。

private Process myProcess = new Process(); private int elapsedtime; private bool eventHandled; public void RunFfmpeg(string arguments) { elapsedtime = 0; eventHandled = false; try { myProcess.StartInfo.FileName = "ffmpeg.exe"; myProcess.StartInfo.Arguments = arguments; myProcess.StartInfo.CreateNowindow = true; myProcess.EnableRaisingEvents = true; myProcess.Exited += new EventHandler(myProcess_Exited); myProcess.Start(); } catch (Exception ex) { Console.WriteLine("An error occurred trying to print "{0}":" + "n" + ex.Message,fileName); return; } // Wait for Exited event,but not more than 30 seconds. const int SLEEP_AMOUNT = 100; while (!eventHandled) { elapsedtime += SLEEP_AMOUNT; if (elapsedtime > 30000) { break; } Thread.Sleep(SLEEP_AMOUNT); } } private void myProcess_Exited(object sender,System.EventArgs e) { eventHandled = true; Console.WriteLine("Exit time: {0}rn" + "Exit code: {1}rnElapsed time: {2}",myProcess.ExitTime,myProcess.ExitCode,elapsedtime); }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐