Я поставлю это как ответ, а не комментарий:
потоки, кажется, ожидают завершения до инициализации следующего
ThreadPool - это именно то, на что это похоже: небольшой пул потоков. Для наших целей давайте представим, что в пуле 10 потоков. Если вы поставите в очередь 1000 задач, первые 10 задач будут выполнены в 10 доступных потоках, а остальные поставлены в очередь и ждут завершения задачи.
HTTP-вызовы медленные , и он удерживает один из ваших потоков в заложниках, пока не завершится. Понятно, что запуск множества длительных задач очень быстро приводит к немедленному истощению пула потоков всех доступных потоков, а оставшиеся задачи ставятся в очередь до тех пор, пока другой поток не станет доступным. Другими словами, то, что вы видите, является предполагаемым поведением ThreadPools .
Для чего бы то ни было, вы можете использовать WebClient.DownloadStringAsync (Uri uri, token объекта) и WebClient.DownloadStringCompleted , чтобы совершать HTTP-вызовы без блокировки текущего потока, и поэтому верните его обратно в пул потоков для использования другими задачами.
I was under the assumption that the threads can run simultaneously "side-by-side"
Потоки действительно работают бок о бок, но у вас не будет 1000 потоков одновременно. Потоки имеют огромные накладные расходы, поскольку каждый поток имеет свой собственный стек, и по умолчанию размер стека составляет около один мегабайт в размере .
Поскольку создавать потоки очень дорого, .NET предварительно выделяет несколько потоков и помещает их в ThreadPool. (Количество потоков по умолчанию зависит от размера вашего виртуального адресного пространства, количества ядер ЦП и т. Д.) Задачи выполняются в потоке потоков, после завершения поток возвращается обратно в пул, чтобы его можно было использовать повторно. другой задачей - что лучше, чем создание нового потока для каждой задачи.
так что мне нужно установить количество
темы, с
setminthreads / MaxThreads?
Нет. Не возиться с методами SetMinThreads / SetMaxThreads - ThreadPool уже высоко оптимизирован для добавления большего количества потоков в пул при необходимости. Если вы не являетесь экспертом в том, как CLR обрабатывает потоки, существует очень высокая вероятность того, что использование по умолчанию TheadPool приведет к снижению производительности .
Вы можете найти это полезным: http://www.albahari.com/threading/