2011-10-11 73 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

相关问题