Этот вопрос закрыт для ответов, так как повторяет вопрос Как управлять количеством потоков в С#?
AlexEternal
@AlexEternal

Как заставить ThreadPool правильно потоки запускать?

Всем привет. Есть задача замучить C# но заставить работать как мне надо.
В общем есть метод который вызывается в многопотоке. Тут он вызывается 9 раз.
В каждом потоке тайминг будет разный то есть время работы будет разная.
static void Main()
        {
            ThreadPool.SetMaxThreads(3, 3);
            for (int i = 0; i < 9; i++)
                ThreadPool.QueueUserWorkItem(JobForAThread, new object[] { i });
            Console.ReadLine();
        }
static void JobForAThread(object state)
        {
            object[] array = state as object[];
            int x = Convert.ToInt32(array[0]);
            Console.WriteLine("цикл {0}, выполнение внутри потока из пула {0}", x,
                    Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(10000);
            Console.WriteLine("Закончил работать {0}", x);
        }


Выход:
5bd4733e5791b112718212.png

Но это для меня не правильно, нужно иначе. Грубо говоря у меня есть n -итераций и будет вызывается метод JobForAThread. Так как я указал SetMaxThreads(3,3) я рассчитывал, что она сначала с тремя потоками закончить и дальше возьмется работать.
То есть по итогу мне нужно:
цикл 0, выполнение внутри потока из пула {0}
цикл 1, выполнение внутри потока из пула {1}
цикл 2, выполнение внутри потока из пула {2}
....ожидание пока они закончат
"Закончил работать {0}"
цикл 3, выполнение внутри потока из пула {3}
"Закончил работать {1}"
цикл 4, выполнение внутри потока из пула {4}
"Закончил работать {2}"
и т.д.

Что я неправильно делаю? И ThreadPool для этой задачи не подходит?

UPD:
Всё отлично подходит ошибка была в том, что метод SetMaxThreads не может установить меньше потоков чем количество ядер а именно:
Максимальное число рабочих потоков или потоков завершения ввода-вывода в число не может задать меньше, чем количество процессоров на компьютере. Чтобы определить, сколько процессоров присутствуют, получения значения Environment.ProcessorCount свойство. Кроме того невозможно задать максимальное число рабочих потоков или потоков завершения ввода-вывода в число меньше, чем соответствующий минимальное количество рабочих потоков или потоков завершения ввода-вывода. Чтобы определить размер пула потоков, минимальное, вызовите GetMinThreads метод.


Исполья эту инфу всё работает как надо:
5bd47ad86d5e5579698015.png
  • Вопрос задан
  • 472 просмотра
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы