0

我正在做一些 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();
        }
    }   
}
4

4 回答 4

2

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

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

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

于 2013-02-19T09:03:25.490 回答
0

我会采用一些方法,我只计算我已经启动了多少线程,并在每个线程结束时减少计数器。

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

while(counter >= 5)
{
//Wait
}
于 2013-02-19T08:52:22.510 回答
0

您可以有一个等待所有线程结束的 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 循环之后保留线程,你应该有另一个列表来存储线程。

于 2013-02-19T08:52:31.643 回答
0

您为该方法提供了多少计算?

阅读代码,如果您提供 4 个计算,您将启动 4 个线程,但从未真正转到执行 thread.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();
    }
于 2013-02-19T08:58:37.307 回答