2011-11-01 100 views
-2

现在,我的功能很好。如何等候多个线程完成?

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(); 
    } 
} 

那么,我应该为我的purporse做些什么呢?

+5

那么你的问题是什么? – sll

+0

为什么你想让你的线程分三次运行?如果你有一个你想异步运行的任务,并且它有3个阶段,它们在返回之前在同一个子线程中运行。如果你有3个不同的任务要运行,为什么不只是产生3个独立的工作线程并完成它? – rie819

+0

@ rie819,因为我运行这个重复数百次。所以... –

回答

0

尝试

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

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

编辑:但是,TPL解决方案肯定是更清洁。

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() 
     ); 
    } 
} 

此外,这将需要线程池的优势,而不是发射了各自的时间,这很可能将是更有效的一个新的线程。 (这也将有可能重新使用当前线程,而不是让它坐拦截...)

+0

我不理解var fooTask =(Task.Factory.StartNew(()=> fooFunction()); var monitorTask = Task.Factory.StartNew(()=> MonitoringThreadFunction()); Task.WaitAll(fooTask,monitorTask); 你能解释一下吗?谢谢! –

+0

Join()解决方案似乎不适用于此处。想知道为什么 –

+1

@AndersLind不知道为什么Join不起作用 - 但任务选项(以及我的改进的Parallel.Invoke版本)使用任务并行库。有关任务的详细信息,请参阅:http://reedcopsey.com/2010/03/15/parallelism-in-net-part-13-introducing-the-task-class/对于Parallel.Invoke,请参阅:http:// reedcopsey.com/2010/02/26/parallelism-in-net-part-11-divide-and-conquer-via-parallel-invoke/ –