Хорошо, здесь мой вопрос. Я хочу начать потоки до определенного числа. Допустим, 100. Таким образом, он начнет запускать потоки и постоянно проверяет количество запущенных потоков. Когда достигнуто максимальное число, оно прекратит запуск новых потоков. Но с правильным интервалом проверки или завершенной нитью будет сигнал, и он начнет новую нить.Как сделать определенное количество потоков, работающих все время
Таким образом, у меня всегда будет определенное количество работающих потоков.
Мне это удалось, используя сон и постоянное время. Поэтому я продолжаю проверять общее количество запущенных потоков с заданным интервалом, и если поток завершен, утилизируйте его и запустите новый.
Но мое решение не подходит мне надлежащим образом. Полагаю, было бы лучше, если бы заполненный поток прозвучал, и тогда контролер начнет новый, если мы ниже максимального количества порогов потоков.
Я видел много примеров threadpool, но большинство из них не содержит пулов в очереди с максимальным количеством работающих потоков. Я имею в виду, что они просто продолжают создавать темы, пока они не закончатся. Но скажем, у меня есть 500k URL-адресов для сбора урожая. Я не могу просто запустить их все в цикле for с пулом потоков.
платформа C# 4.5 WPF приложение
А вот ниже мое решение. На самом деле я ищу лучшего. Не улучшилось это.
private void Button_Click_4(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
startCrawler();
});
}
void startCrawler()
{
int irMaximumThreadcount = 100;
List<Task> lstStartedThreads = new List<Task>();
while (true)
{
for (int i = 0; i < lstStartedThreads.Count; i++)
{
if (lstStartedThreads[i].IsCompleted == true)
{
lstStartedThreads[i].Dispose();
lstStartedThreads.RemoveAt(i);
}
}
if (lstStartedThreads.Count < irMaximumThreadcount)
{
var vrTask = Task.Factory.StartNew(() =>
{
func_myTask();
});
lstStartedThreads.Add(vrTask);
}
System.Threading.Thread.Sleep(50);
}
}
void func_myTask()
{
}
«Я не могу просто запустить все из них в цикле for с пулом потоков». - Ты действительно пробовал? Запуск нескольких потоков с предположением, что это сделает ваше общее интернет-соединение быстрее, не звучит «как правильный способ». Также conisder с использованием асинхронных операций - не потребуется столько потоков ... Если у вас нет чего-то вроде 32-ядерной машины ... –