如何等待多个线程完成?

时间:2011-11-01 16:30:56

标签: c# windows multithreading

现在,我的功能运作良好。

StartWorking() {
    mThread = new Thread(fooFunction);
    mMonitorThread = new Thread(MonitoringThreadFunction);

    mThread.Start();
    mMonitorintThread.Start();    
}

现在,我需要为此代码添加一个loog。让它连续运行几次。顺序。 我试过这样做。但它搞砸了。线程的工作不正常。

StartWorking()
{
    for(int i = 0; i < 3; i++)
    {
        mThread = new Thread(fooFunction);
        mMonitorThread = new Thread(MonitoringThreadFunction);

        mThread.Start();
        mMonitorintThread.Start();
    }
}

那么,我该怎样做才能为我的目的做什么?

2 个答案:

答案 0 :(得分:3)

  

让它连续运行几次。顺序。

如果您尝试按顺序运行代码,则线程可能不合适。至少,您需要启动两个工作线程,然后等待它们完成。

这可以通过添加对Join()的调用,在您的代码中完成,即:

 StartWorking()
 {
     for(int i = 0; i < 3; i++)
     {
       mThread = new Thread(fooFunction);
       mMonitorThread = new Thread(MonitoringThreadFunction);

       mThread.Start();
       mMonitorintThread.Start();

       // Wait for these to finish before starting another loop
       mThread.Join();
       mMonitorintThread.Join();
     }

 }

但是,我建议考虑将其切换为使用TPL。语法更清晰,IMO:

 StartWorking()
 {
     for(int i = 0; i < 3; i++)
     {
        Parallel.Invoke(
           () => fooFunction(),
           () => MonitoringThreadFunction() 
        );
     }
 }

此外,这将利用ThreadPool而不是每次都启动一个新线程,这可能会更有效。 (它也可能会重用当前的线程,而不是让它阻塞......)

答案 1 :(得分:0)

尝试

mThread.Join();
mMonitorThread.Join();

或者,如果您使用.NET≥4,请使用System.Threading.CountdownEvent和InitialCount = 2并将其传递给Thread.Start()方法。

编辑:然而,TPL解决方案绝对更清晰。