我有这个压缩视频任务,它使用外部程序在c#中完成。此压缩完成并写入文件需要一些时间。在我知道外部操作有时间完成之前,我不想运行下一段代码。
我想做一个简单的Thread.sleep(有些猜测);然后运行下一行代码或者有更好的方法吗?
这就是我压缩视频的方式:
try
{
String finalCommand = "";
String thePath = System.IO.Path.GetDirectoryName(fileName);
finalCommand ="-i " + fileName + " -s 320x240 -b 300k -r 30 -f avi " + thePath + "\\C" + System.IO.Path.GetFileName(fileName);
System.Diagnostics.ProcessStartInfo ffmpegcmd = new System.Diagnostics.ProcessStartInfo(Application.StartupPath + "\\ffmpeg.exe",
"-i \"" + fileName + "\" -s 320x240 -b 300k -r 30 -f avi \"" + thePath + "\\C" + System.IO.Path.GetFileName(fileName) + "\"");
ffmpegcmd.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
System.Diagnostics.Process p = System.Diagnostics.Process.Start(ffmpegcmd);
LogUtil.writeLog("About to wait for FFMPEGCMD process");
p.WaitForExit();
success = true;
LogUtil.writeLog("FFMPEGCMD process exited perfectly!");
}
catch (Exception ex)
{
LogUtil.writeLog("ERROR compressing and using FFMPEG");
success = false;
}
虽然我意识到我不确定这是不是自己做了一个进程/线程嗯。
答案 0 :(得分:3)
如果您正在使用新主题,则只需致电Thread.Join
:
Thread.Join(otherThread);
......可能超时。
在.NET 4中,您可以使用任务并行库(创建Task
或Task<TResult>
),然后调用Wait
。 (如果你使用的是.NET 4,那么TPL绝对是一般的方式 - 你可以用它来做很多的东西。)
这两种方法都是阻止 - 它们将阻止等待线程执行任何其他操作,直到其他任务完成为止;这不是你想在UI线程中做的事情。所以如果这是在用户界面的上下文中,最好使用回调 - 在完成后将其他任务调用回UI线程;这可以启动下一段代码。
编辑:您展示的代码是创建新的进程,而不是新的线程。您可能也在新线程中执行此操作,但您尚未显示。目前还不清楚这是否都发生在Windows窗体或WPF等UI中,或者它是否仅仅是一个控制台应用程序。
答案 1 :(得分:0)
看看msdn:Task Parallel Library
答案 2 :(得分:0)
Public void compressVideo(obkect o)
{
\\ code
}
Thread t = new Thread( new threathStart( \\ pass the method that you want to execute on this thread...
t.start(parameterYouWishtoPas);
while(t.IsAlive)
{
Thread.sleep(1);
}
\\ this line will not execute untill thread t finishes executing...
答案 3 :(得分:0)
我不会做Tano建议的睡眠建议......没有理由为了等待另一个线程(忙等待)而占用CPU。 乔恩的建议就是你所需要的。
如果压缩线程出于某种原因永远不会结束,那么我建议您尝试使用reset events。 看看here