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

本文关键字:执行 是否 线程 何检查 检查 | 更新日期: 2023-09-27 18:11:08

我正在执行一个线程,它调用BCP在命令提示符中使用c# win应用程序。如果线程执行完成,即BCP out完成,我想做一些操作。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
    }
}

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

一个标准的技巧是:

thread1.Join();
thread2.Join();
//can only get here once both threads are finished.

好的,所以你实际上想检查进程是否已经退出?

那么你有System.Diagnostics.Process的HasExited属性。

这里有一个稍微有点脏的方法:

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

您可以使用Thread.IsAlive属性

另一种可能性是使用线程在完成时设置的AutoResetEvent。调用线程可以等待多个AutoResetEvents被设置。

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