Порождает задачу в c # и знает, когда она закончится - PullRequest
1 голос
/ 01 сентября 2011

У меня есть эта задача сжатия видео, которая использует внешнюю программу, чтобы сделать это на 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 ]

3 голосов
/ 01 сентября 2011

Если вы используете новую тему, вы можете просто позвонить Thread.Join:

Thread.Join(otherThread);

... возможно с таймаутом.

InВ .NET 4 вы можете использовать параллельную библиотеку задач (создавая Task или Task<TResult>), а затем вызывать Wait.(Если вы используете .NET 4, TPL определенно является подходящим способом - вы можете сделать с ним лотов .)

Оба эти подхода блокирование - они будут мешать ожидающему потоку делать что-либо еще, пока другая задача не будет завершена;это не то, что вы хотите сделать в потоке пользовательского интерфейса.Так что , если это в контексте пользовательского интерфейса, было бы лучше использовать обратный вызов вместо этого - сделать вызов другой задачи обратно в поток пользовательского интерфейса, когда это будет сделано;это может запустить следующий фрагмент кода.

РЕДАКТИРОВАТЬ: код, который вы показали, создает новый процесс , а не новый поток .Вы можете также делать это в новой ветке, но вы этого не показали.Также все еще неясно, происходит ли все это в пользовательском интерфейсе, таком как Windows Forms или WPF, или это просто консольное приложение.

0 голосов
/ 01 сентября 2011

Я бы не делал предложение сна, которое предложил Тано ... нет никакой причины занимать процессор только для ожидания другого потока (ожидание занятости). Предложение Джона - то, что вам нужно.

Если поток сжатия по какой-то причине никогда не заканчивается, я предлагаю вам попробовать сбросить события . Взгляните здесь

0 голосов
/ 01 сентября 2011
   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...
0 голосов
/ 01 сентября 2011

Посмотрите на msdn: Task Parallel Library

...