2017-01-23 2 views
0

Я создал метод для вызова двоичных файлов ffmpeg и для этого делал вещи. Он работал отлично на стандартном консольном приложении. Я пытаюсь сделать версию приложения Windows Form, но проблем мало. Приложение зависает (но индикатор выполнения все еще обновляется), когда процесс ffmpeg все еще работает. Текстовые поля не обновляются. Я не могу переместить окно приложения. Я подозреваю, что это из-за цикла, и я искал некоторые вещи и выяснил, что мне может понадобиться сделать это асинхронно, но как это сделать.C# - Как асинхронно передавать поток из ffmpeg

public void ffmpeg(string ffmpeg_exe, string args) 
     { 
      Process p = new Process(); 
      p.StartInfo.FileName = ffmpeg_exe; 
      p.StartInfo.RedirectStandardError = true; 
      p.StartInfo.CreateNoWindow = true; 
      p.StartInfo.Arguments = args; 
      p.StartInfo.UseShellExecute = false; 
      p.Start(); 

      StreamReader reader = p.StandardError; 
      string line; 

      string size = "", current_duration = "", duration = ""; 

      while ((line = reader.ReadLine()) != null) 
      { 
       if (!string.IsNullOrEmpty(line)) 
       { 
        if (line.Contains("Duration") && line.Contains("bitrate") && line.Contains("start")) 
        { 
         duration = RemoveWhitespace(Between(line, "Duration:", ", start")); 
         totaltime.Text = duration; 
        } 

        if (line.Contains("frame=") && line.Contains("size=") && line.Contains("time=")) 
        { 
         size = RemoveWhitespace(Between(line, "size=", " time")); 
         current_duration = RemoveWhitespace(Between(line, "time=", " bitrate")); 
         progressBar_main.Value = Convert.ToInt32(Math.Round(TimeSpan.Parse(current_duration.Substring(0, current_duration.Length -3)).TotalSeconds * 100/TimeSpan.Parse(duration.Substring(0,duration.Length-3)).TotalSeconds, 3)); 
         current_time.Text = current_duration; 
         filesize.Text = size; 
        } 
       } 
      } 

      p.Close(); 

      current_time.Text = ""; 
      filesize.Text = ""; 
      totaltime.Text = ""; 
      progressBar_main.Value = 0; 

     } 

ответ

0

Попробуйте использовать Task так:

Action action =() => 
          { 
           //Do your streaming here 
          }; 

Затем запустите его:

Task t2 = Task.Factory.StartNew(action); 

Надежда это было полезно.

+0

Теперь я могу создать задачу и запустить ее. Он работал правильно, но основное событие (нажатие кнопки) не будет ждать завершения. –

+0

Это не будет ждать, потому что задача выполняется асинхронно, вы можете создать событие, которое будет поднято при завершении задачи. –

+0

О, ладно. Понял. –

Смежные вопросы