等待线程结束时出现问题
本文关键字:问题 线程 结束 等待 | 更新日期: 2023-09-27 17:59:57
我正在进行一些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
案例的处理。如果已经有五个线程,代码将等待线程完成,但它试图添加的任务永远不会添加。它只会放弃那个任务,继续下一个任务。
第二个问题是,您没有从列表中删除任何线程,所以一旦它达到五个线程,它将永远等待。如果第一个问题没有放弃其余的任务,那么程序就会锁定。
此外,在继续工作之前等待所有五个线程完成是在浪费处理时间,但这是一个较小的问题。
我会采用某种方法,只计算我已经启动了多少个线程,在每个线程结束时,我会减少计数器。
然后在循环的开始,你可以有
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循环之后保留for的线程,则应该有另一个用于存储线程的列表。
您为该方法提供了多少计算?
阅读代码时,如果您提供4个计算,您将启动4个线程,但永远不会真正转到执行线程的代码。Join()。
将thread.join循环移到if-else语句之外。
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();
}