等待线程结束的问题
我正在做一些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();
}
}
}
的第一个问题是你的else
箱子处理。如果已经有五个线程,代码将等待线程完成,但是它试图添加的任务永远不会被添加。它只会抛弃该任务并继续下一步。
第二个问题是你不会从列表中删除任何线程,所以一旦它达到五个线程,它将永远等待。如果第一个问题没有放弃其余的任务,你的程序就会锁定。
另外,在继续工作之前等待所有五个线程完成,您正在浪费处理时间,但这是一个较小的问题。
处理时间是浪费了,但是如果线程产生的数据中存在任何依赖关系,那么序列应该在for循环之后等待。 – 2013-02-19 09:09:32
@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循环,你应该有另一个列表用于存储线程。
哎。你绝对不应该有一个繁忙的循环等待线程完成。 – Guffa 2013-02-19 09:08:17
我知道。应该可能在某处有一个超时函数;) – 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();
}
确定计算线程没有全部终止? – 2013-02-19 08:49:47
您是否考虑过使用任务并行库来处理线程,而不是像这样明确地执行它?很多有用的方法让你的生活变得更加简单:http://msdn.microsoft.com/en-us/library/dd537609.aspx – Paddy 2013-02-19 08:50:48
我认为你应该在加入后从CalculationThreads集合中删除线程。 – fofik 2013-02-19 08:53:12