2010-11-02 12 views
4

我有2個外部進程運行(2 console exe),提供輸出到控制檯。我在wpf應用程序上運行這些應用程序。我捕獲控制檯輸出並將其用作輸入。如何在wpf應用程序中運行其他控制檯進程之前等待控制檯進程完成?

這裏我怎麼做 1.運行第一個進程。捕獲控制檯輸出。 2.使用第一個過程輸出做一些工作。 3.運行第二個進程後,我做了一些工作輸出。

我遇到的問題是我必須等待其他進程完成並使用其輸出,然後才能運行其他進程。當我想運行第二個過程時,第一個過程沒有完成。

public MainWindow() 
{ 
    InitializeComponent(); 
    ExtProcess1(); 
    ExtProcess2(); //this is executed before ExtProcess1 OutputDataReceived is completely captured 
    Instance = this; 
} 

public static void ExtProcess1() 
{ 
    Process process = new Process(); 
    process.EnableRaisingEvents = true; 
    process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); 
    process.Exited += new EventHandler(process_Exited); 
    process.StartInfo.FileName = "test.exe"; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.CreateNoWindow = true; 
    process.Start(); 
    process.PriorityClass = ProcessPriorityClass.RealTime; 
    process.BeginOutputReadLine(); 
    process.WaitForExit(); 
} 

static void process_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    if (MainWindow.Instance.lbLog.Dispatcher.Thread == Thread.CurrentThread) 
    { 
     String s = (String)e.Data; 
     MainWindow.Instance.lbLog.Items.Add(s); 
    } 
    else 
    { 
     MainWindow.Instance.lbLog.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, 
      new EventHandler<DataReceivedEventArgs>(corePingPid_OutputDataReceived), sender, new object[] { e }); 
    } 
} 

如何強制wpf應用程序在運行第二個進程之前等待第一個進程?

回答

3

假設您正在使用Process類執行並捕獲控制檯的輸出,則可以使用Process.WaitForExit方法。它會阻塞當前線程,直到進程完成執行。還有另一個重載可以阻塞當前線程,直到進程結束或指定的超時時間過去。

+0

這也是我使用的。只要小心一點,因爲它會鎖定你的GUI線程,如果你嘗試在那裏運行它。 – jocull 2010-11-02 05:42:31

+0

我確實使用了process.waitforexit()。我也使用process.outputdatareceived,這是我捕獲控制檯輸出。 – 2010-11-02 06:17:39

+0

@publicEnemy,你在哪裏開始你的第二個過程?在對第一個進程調用WaitForExit()之後,它應該在同一個線程上。 – VinayC 2010-11-02 06:26:29

相關問題