2011-07-21 15 views
7

Tengo un método que se llama, aunque me gustaría que se muestre el cuadro de mensaje después de que se haya completado el método (ahora el cuadro de mensaje se muestra justo después de llamar al método) :Esperando hasta que se complete un proceso externo

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(); 
} 
+2

La ejecución de código por defecto es síncrona. Parece que StartConvIpod está realizando asincrónicamente por su descripción. ¿Puedes publicar el código para 'StartConvIpod'? – vcsjones

+0

¿Qué significa 'StartConvIpod();' hacer? En este momento, supongo que en realidad no estás presionando la función, sino que estás saltando al caso else. –

+0

@vcsjones He actualizado mi código –

Respuesta

7

Utilice esta al final de su código:

p.WaitForExit(); 

No se olvide de comprobar su valor de retorno para asegurarse de que en realidad fue un éxito, sin embargo:

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

Usted querrá añadir lo siguiente:

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

* golpea la cabeza contra la pared * gracias –

+0

@ Adam Jones: No hay problema. –

3

Usted tiene un par de opciones. En StartConvIpod, puede poner p.WaitForExit() después p.Start();

Eso funcionará, pero probablemente bloquear el hilo de interfaz de usuario (que parece que su aplicación está congelada). En cambio, cambiaría su UI a algún tipo de estado de "trabajo", como deshabilitar el botón "Comenzar conversión" y establecer una etiqueta como "Convertir" (solo como ejemplo). Luego me registraría en el evento p.Exited y cuando se cierre su proceso. Cuando se produce un evento, puede notificar a la UI que su conversión está completa y verificar el código de salida del proceso.

0

Utilice el evento Process.Exited según MSDN Documentation for the Process Exit Event y vuélvalo a interrogar durante 30 segundos hasta que el evento Exited se desactive y compruebe el código de salida.

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}\r\n" + 
     "Exit code: {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime); 
} 
Cuestiones relacionadas