2011-10-11 71 views
3

我正在執行一個使用C#win應用程序在命令提示符下調用BCP的線程。 如果線程執行完成,即BCP輸出完成,我想要執行一些操作。 BCP out在本地機器上運行。 我應該如何檢查線程執行是否完成? 我的代碼看起來像如何檢查線程執行是否完成

using(this.proc = new Process()) 
{ 
    var procStartInfo = 
    new ProcessStartInfo(cmdFileName) 
     { 
      UseShellExecute = false, 
      RedirectStandardOutput = true, 
      RedirectStandardError = true, 
      WindowStyle = ProcessWindowStyle.Hidden, 
      CreateNoWindow = true 
     }; 

    this.proc.StartInfo = procStartInfo; 
    if(this.proc.Start()) 
    { 
     var thread1 = new Thread(this.GetError) { IsBackground = true }; 
     var thread2 = new Thread(this.GetOutput) { IsBackground = true }; 
     thread1.Start(); 
     thread2.Start(); 

     // check if thread execution is completed then do some logic 
    } 
} 
+0

你想等待線程或進程? –

+0

過程。當BCp out完成時,只有我必須走向下一步。但是爲了支持我已經實現了2個線程的流程。 – vaibhav

回答

3

標準的訣竅是:

thread1.Join(); 
thread2.Join(); 

//can only get here once both threads are finished. 

更新

好了,你真的想檢查進程已退出?

然後你有HasExited財產System.Diagnostics.Process

這裏有一個稍微骯髒的方式:

while(!proc.HasExited){ 
    Thread.Sleep(1000); //wait a second 
} 
+0

thread1檢查輸出的錯誤和thread2檢查。由你給出的代碼將一直執行到thread1完成,並且在thread2執行期間如果出現錯誤,那麼thread1將不會讀取錯誤。 – vaibhav

+0

已更新 - 您可以輪詢'proc.HasExited' –

1

可以使用Thread.IsAlive屬性。

另一種可能性是使用線程在完成時設置的AutoResetEvent。調用線程可以等待幾個AutoResetEvents被設置。當所有設置完成後,所有工作都完成了。

+0

Thread.IsAlive屬性在執行完成時被賦值爲false,或者僅當線程被中止時賦值爲false。 – vaibhav

+1

該文檔(http://msdn.microsoft.com/en-us/library/system.threading.thread.isalive.aspx)說:如果此線程已啓動並且尚未正常終止或中止,則爲true;否則,是錯誤的。 – PVitt

0

隨着Process類,你可以通過EnableRaisingEvents屬性設置爲true處理類似事件Exited,雖然這涉及到在性能方面的一些成本。

var p = new Process(); 
p.EnableRaisingEvents = true; 
p.Exited += new EventHandler(p_Exited); 

public void p_Exited(object sender, EventArgs e) 
{ 
    //handle exiting of process here. 
} 
+0

實際上我創建了2個線程來獲取stdError和stdOutput,它們也影響性能。以上的方式將會提高性能而不是我的實現? – vaibhav

+0

我無法對性能做任何說明,但它會告訴你什麼時候存在spwaned進程。 – TheVillageIdiot

相關問題