在c#中生成一个任务并知道它何时完成

时间:2011-09-01 05:27:52

标签: c# multithreading wait thread-sleep

我有这个压缩视频任务,它使用外部程序在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;
        }

虽然我意识到我不确定这是不是自己做了一个进程/线程嗯。

4 个答案:

答案 0 :(得分:3)

如果您正在使用新主题,则只需致电Thread.Join

Thread.Join(otherThread);

......可能超时。

在.NET 4中,您可以使用任务并行库(创建TaskTask<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