如何检查线程执行是否完成

时间:2011-10-11 09:04:47

标签: c# .net

我正在执行一个线程,它使用C#win apps在命令提示符中调用BCP out。 如果线程执行完成,即BCP输出完成,我想做一些动作。 BCP输出在本地机器上进行。 我应该如何检查线程执行是否完成? 我的代码看起来像

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

3 个答案:

答案 0 :(得分:3)

标准技巧是:

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

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

<强>更新

好的,所以你真的想检查一下这个过程是否退出了?

然后您拥有System.Diagnostics.Process的{​​{3}}属性。

这是一种略显肮脏的方式:

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

答案 1 :(得分:1)

您可以使用Thread.IsAlive属性。

另一种可能性是在完成时使用线程设置的AutoResetEvent。调用线程可以等待设置几个AutoResetEvents。完成所有工作后,所有工作都已完成。

答案 2 :(得分:0)

使用Process类,您可以通过将Exited属性设置为EnableRaisingEvents来处理true之类的事件,但这会在性能方面涉及一些成本。

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.
}