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();
}
4 Réponses :
Vous voudrez ajouter ceci:
p.Start(); p.WaitForExit(); // or p.WaitForExit(Timeout-Period-In-Milliseconds);
Utilisez ceci à la fin de votre code:
if(p.ExitCode == 0) { // Or whatever return code you're expecting
//...
}
Vous avez quelques options. Dans Ç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 code> 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. P> startconvipod code>, vous pouvez mettre p.waitforexit () code> après p.start (); code> p> p> p>
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);
}
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 code>?Qu'est-ce que
startconvipod (); code> 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