когда родительский поток спит, дочерние потоки также спят? - PullRequest
6 голосов
/ 22 октября 2011

когда родительский поток спит, дочерние потоки также спят?

Теперь основной поток - это пользовательский интерфейс Я создаю 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 ]

10 голосов
/ 22 октября 2011

Нет такого понятия, как «родительский» поток. Один поток запускает другой, но тогда между ними нет особых отношений. Например, начальный поток может прекратить работу, не потеряв ни одного из новых потоков.

Спящий исходный поток определенно не влияет ни на один другой поток.

1 голос
/ 22 октября 2011
Thread.Sleep(...)

только приостанавливает текущий поток.

проверьте здесь: Thread.Sleep Method

, чтобы все остальные потоки продолжали работать.

1 голос
/ 22 октября 2011

Нет понятия родительского и дочернего потоков.Одним из следствий этого является то, что дочерние потоки не спят, когда родительский поток спит.

0 голосов
/ 22 октября 2011

Остальные правы, в .Net нет понятия «родительские потоки». И ожидание в одном потоке не заставляет другие потоки ждать (если не задействована некоторая синхронизация, например использование lock s).

Но есть еще один момент: ваш код не создает новых потоков, по крайней мере, не обязательно. Когда вы вызываете Task.Factory.StartNew(), задача обычно планируется в потоке пула потоков. Если нет доступных потоков, а число потоков еще не достигло максимально допустимого, создается новый поток . Но в других случаях это не так. Задача либо собирается повторно использовать существующий свободный поток, либо будет ждать, пока один из них не станет доступным.

0 голосов
/ 22 октября 2011

Каждая нить всегда полностью независима.Единственная возможная связь между потоками состоит в том, что, когда все не фоновые потоки заканчиваются, программа завершается, поэтому фоновые потоки умирают.Если поток спит, другие потоки продолжают работать (и, вероятно, работают быстрее, потому что работает на один поток меньше).Если вам нужно синхронизировать потоки, для этого есть различные классы (в основном блокировки (не класс), мьютексы, семафоры ...)

...