当父线程睡眠时子线程还睡觉吗?

时间:2011-10-22 13:51:05

标签: c# wpf multithreading sleep task-parallel-library

当父线程睡眠时子线程也睡觉了吗?

现在主线程是UI 我在主线程中用任务工厂创建20个子线程(让我们调用线程2) 在这20个子线程中,我再次使用子工厂创建另外10个子线程(让我们调用线程3)

现在在这个线程2中我有无限循环。无限循环内部检查线程3是否完成。如果完成处置完成的线程并启动另一个线程。我正在使用250毫秒的睡眠,每次检查内部无限循环。因此,当睡眠中的线程2也线程3睡眠或它们是独立的。这里是您可以看到的代码。

while (true)
{
    int irActiveThreadCount = 0;
    int irFinishedLast = -1;

    for (int i = 0; i < irPerMainSiteThreadCount; i++)
    {
        if (MainSitesTaskList[irWhichMainTask, i] == null)
        {
            irFinishedLast = i;
            break;
        }
        if (MainSitesTaskList[irWhichMainTask, i].IsCompleted == true)
        {
            irFinishedLast = i;
            break;
        }
    }

    for (int i = 0; i < irPerMainSiteThreadCount; i++)
    {
        if (MainSitesTaskList[irWhichMainTask, i] != null)
            if (MainSitesTaskList[irWhichMainTask, i].IsCompleted == false)
            {
                irActiveThreadCount++;
            }
    }

    if (irFinishedLast > -1)
    {
        var newTask = Task.Factory.StartNew(() =>
        {
            fcStartSubPageCrawl(srMainSiteURL, srMainSiteId, irWhichMainTask);
        });
        lock (lockerMainSitesArray)
        {
            if (MainSitesTaskList[irWhichMainTask, irFinishedLast] != null)
                MainSitesTaskList[irWhichMainTask, irFinishedLast].Dispose();
            MainSitesTaskList[irWhichMainTask, irFinishedLast] = newTask;
        }
    }

    Thread.Sleep(250);

    srQuery = "myquery";
    using (DataSet dsTemp = DbConnection.db_Select_Query(srQuery))
    {
        if (dsTemp != null)
            if (dsTemp.Tables.Count > 0)
                if (dsTemp.Tables[0].Rows.Count == 0)
                {
                    break;
                }
    }
}

5 个答案:

答案 0 :(得分:10)

真的没有“父”线程这样的东西。一个线程启动另一个线程,但之后它们之间没有特定的关系。例如,起始线程可以在没有任何新线程死亡的情况下终止。

开始线程休眠肯定不会影响任何其他线程。

答案 1 :(得分:1)

没有父线程和子线程的概念。这样做的一个含义是,当父线程休眠时,子线程不会休眠。

答案 2 :(得分:1)

Thread.Sleep(...)

只挂起当前的线程。

点击此处:Thread.Sleep Method

所以其他所有线程都会继续工作。

答案 3 :(得分:0)

每个帖子总是完全独立的。线程之间唯一可能的连接是当所有非后台线程完成时,程序结束,因此后台线程死亡。如果一个线程休眠,其他线程继续工作(并且可能会更快,因为少一个线程工作)。如果你需要同步线程,有各种类来做它(通常锁(不是类),互斥,信号量......)

答案 4 :(得分:0)

其他人是正确的,.Net中没有“父线程”的概念。等待一个线程不会导致其他线程等待(除非涉及一些同步,例如使用lock)。

但还有另外一点:您的代码不会创建新线程,至少不一定。当您调用Task.Factory.StartNew()时,通常会在线程池线程上安排该任务。如果没有任何线程可用且线程数尚未达到允许的最大数量,则创建新线程 。但在其他情况下,事实并非如此。该任务要么重用现有的空闲线程,要么等待,直到有一个可用。