等待线程结束的问题

问题描述:

我正在做一些C#线程。没有任何问题启动线程并将数据传输给它们,但我在等待它们结束时遇到问题。等待线程结束的问题

我的代码如下所示。我使用Join()来等待线程结束,但由于某种原因,我的代码无法工作。

尽管在所有活动线程上调用Join(),主线程(即for循环)仍未被阻止。

任何想法,我做错了吗?

List<Thread> calculationThreads = new List<Thread>(); 

foreach (string calculation in calculations) 
{ 
    if (calculationThreads.Count < 5) 
    { 
     Thread calculationThread = new Thread(DoCalculation); 
     calculationThreads.Add(calculationThread); 

     calculationThread.Start(threadData); 
    } 
    else 
    { 
     // Wait for the threads to complete 
     foreach (Thread calculationThread in calculationThreads) 
     { 
      calculationThread.Join(); 
     } 
    } 
} 
+2

确定计算线程没有全部终止? – 2013-02-19 08:49:47

+1

您是否考虑过使用任务并行库来处理线程,而不是像这样明确地执行它?很多有用的方法让你的生活变得更加简单:http://msdn.microsoft.com/en-us/library/dd537609.aspx – Paddy 2013-02-19 08:50:48

+0

我认为你应该在加入后从CalculationThreads集合中删除线程。 – fofik 2013-02-19 08:53:12

的第一个问题是你的else箱子处理。如果已经有五个线程,代码将等待线程完成,但是它试图添加的任务永远不会被添加。它只会抛弃该任务并继续下一步。

第二个问题是你不会从列表中删除任何线程,所以一旦它达到五个线程,它将永远等待。如果第一个问题没有放弃其余的任务,你的程序就会锁定。

另外,在继续工作之前等待所有五个线程完成,您正在浪费处理时间,但这是一个较小的问题。

+0

处理时间是浪费了,但是如果线程产生的数据中存在任何依赖关系,那么序列应该在for循环之后等待。 – 2013-02-19 09:09:32

+1

@StianStandahl:是的,当最后一项任务处理到一个线程时,您必须等待所有步骤完成才能使用结果,这是不可避免的。然而,现在的代码会以五人一组的方式削减任务,并为每个团队获得浪费。 – Guffa 2013-02-19 09:14:28

我会去一些方法,我只是计算有多少线程我已经开始在每个线程结束时,我降低了柜台。

然后在你的循环的开始,你可以有

while(counter >= 5) 
{ 
//Wait 
} 

你可以有一个while循环等待所有线程结束。

List<Thread> calculationThreads = new List<Thread>(); 

foreach (string calculation in calculations) 
{ 
    if (calculationThreads.Count < 5) 
    { 
     Thread calculationThread = new Thread(DoCalculation); 
     calculationThreads.Add(calculationThread); 

     calculationThread.Start(threadData); 
    } 
    else 
    { 
     // Wait for the threads to complete 
     while(calculationThread.Any(x => x.IsAlive)){} 
     // Clearing the list 
     calculationThread.Clear(); 
    } 
} 

如果你想保持线程后for循环,你应该有另一个列表用于存储线程。

+0

哎。你绝对不应该有一个繁忙的循环等待线程完成。 – Guffa 2013-02-19 09:08:17

+0

我知道。应该可能在某处有一个超时函数;) – 2013-02-19 09:10:35

您提供给该方法的计算有多少?

阅读代码,如果你提供了4个计算,你将开始4个线程,但从来没有真正去到你做线程的代码.Join()。

移动if else语句外的thread.join循环。

List<Thread> calculationThreads = new List<Thread>(); 

    foreach (string calculation in calculations) 
    { 
     if (calculationThreads.Count < 5) 
     { 
      Thread calculationThread = new Thread(DoCalculation); 
      calculationThreads.Add(calculationThread); 

      calculationThread.Start(threadData); 
     } 

    } 
    foreach (Thread calculationThread in calculationThreads) 
    { 
     calculationThread.Join(); 
    }