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

3

我正在使用C#窗口应用程序执行调用BCP out的线程在命令提示符中。 如果线程执行完成,即BCP out已完成,我想执行某些操作。 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
    }
}

你想等待线程还是进程? - H H
进程。当BCp输出完成后,我才能继续进行下一步。但为了支持进程,我实现了2个线程。 - vaibhav
3个回答

3

一个常用的技巧是:

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

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

更新

好的,你实际上想要检查该进程是否已退出?

那么你可以使用System.Diagnostics.ProcessHasExited属性。

以下是一种稍微有点不规范的方法:

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

线程1检查错误,线程2检查输出。您提供的代码将执行到线程1完成,并在执行线程2期间,如果出现错误,则线程1不会读取错误。 - vaibhav

1
你可以使用 Thread.IsAlive 属性。
另一种可能性是使用 AutoResetEvent,线程在完成时设置它。调用线程可以等待多个 AutoResetEvents 被设置。当所有的都被设置时,所有的工作都完成了。

当线程执行完成时,Thread.IsAlive属性是否被赋值为false,还是只有在线程被中止时才会被赋值为false? - vaibhav
1
文档(http://msdn.microsoft.com/en-us/library/system.threading.thread.isalive.aspx)中写道:如果该线程已启动但未正常终止或被中止,则为true;否则为false。 - 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.
}

实际上,我正在创建两个线程来获取stdError和stdOutput,这也影响了性能。采用上述方式是否会改善性能,而不是我的实现方式? - vaibhav
我无法对性能做出任何评论,但它会告诉你何时存在你的衍生进程。 - TheVillageIdiot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接