7
votes

En attente jusqu'à ce qu'un processus externe soit terminé

J'ai une méthode appelée, bien que je souhaite que la boîte de message soit affichée une fois la méthode terminée (la boîte de message est maintenant affichée droit après que la méthode soit appelée):

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


3 commentaires

L'exécution de code par défaut est synchrone. Il semble que StartConvipod fonctionne de manière asynchrone par votre description. Pouvez-vous publier le code pour startconvipod ?


Qu'est-ce que startconvipod (); faire? En ce moment, je devinerais que vous n'allez pas réellement frapper la fonction mais vous sautez à la place dans le cas.


@vcsjones j'ai mis à jour mon code


4 Réponses :


11
votes

Vous voudrez ajouter ceci:

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


0 commentaires

7
votes

Utilisez ceci à la fin de votre code:

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


0 commentaires

3
votes

Vous avez quelques options. Dans startconvipod , vous pouvez mettre p.waitforexit () après p.start ();

Ça va fonctionner, mais bloquera probablement votre fil d'interface utilisateur (faites-le apparaître que votre application est gelée). Au lieu de cela, je modifierais votre UI à une sorte d'état "de travail", tel que désactiver le bouton "Démarrer la conversion" et définir une étiquette sur "Conversion" (juste à titre d'exemple). Ensuite, je vous enregistrerais sur l'événement P. / code> et lorsque votre processus est sorti. Lorsque l'événement est soulevé, vous pouvez avertir l'interface utilisateur Votre conversion est complète et vérifiez le code de sortie du processus.


0 commentaires

0
votes

Utilisez l'événement Process.Exité selon le Documentation MSDN pour l'événement de sortie de processus et sondage pendant 30 secondes jusqu'à l'incendie de l'événement excepté et vérifiez le code de sortie.

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);
}


0 commentaires