2011-07-21 77 views
7

我有一個被調用的方法,雖然我希望在方法完成後顯示消息框(現在消息框在調用該方法後直接顯示) :等待,直到外部過程已完成

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

默認情況下,代碼執行是同步的。看來,StartConvIpod按照您的描述異步執行。你可以發佈'StartConvIpod'的代碼嗎? – vcsjones

+0

'StartConvIpod();'做了什麼?現在我猜想你實際上並沒有達到這個功能,而是跳入其他情況。 – 2011-07-21 16:56:01

+0

@vcsjones我已經更新了我的代碼 –

回答

7

使用這個在你的代碼的末尾:

p.WaitForExit(); 

不要忘記檢查它的返回值,以確保它實際上是成功的,雖然:

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

你會想補充一點:

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

*點擊頭靠牆*謝謝 –

+0

@Adam Jones:沒問題。 –

3

你有幾個選項。在StartConvIpod,您可以後p.Start();

這會工作提出p.WaitForExit(),但可能會阻止您的UI線程(讓它出現在你的應用程序被凍結)。相反,我會改變你的用戶界面到某種「工作」狀態,例如禁用「開始轉換」按鈕,並將標籤設置爲「轉換」(就像一個例子)。然後,我將在p.Exited活動以及您的進程退出時註冊。當事件發生時,您可以通知UI您的轉換已完成,並檢查流程中的退出代碼。

0

按照MSDN Documentation for the Process Exit Event使用Process.Exited事件並輪詢30秒,直到Exited事件觸發並檢查ExitCode。

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