等待线程结束时出现问题

本文关键字:问题 线程 结束 等待 | 更新日期: 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();
    }