好的,这是我的问题。我想启动线程直到某个数量。假设是 100。所以它将开始启动线程并连续检查正在运行的线程数。当达到最大数量时,它将停止启动新线程。但是如果有适当的检查间隔或完成的线程将发出信号,它将启动新线程。
通过这种方式,我将始终拥有一定数量的运行线程。
我通过使用睡眠和永久时间来解决这个问题。所以我不断检查给定时间间隔内的总运行线程数,如果线程完成,则处理它并启动一个新线程。
但是我的解决方案并不是正确的方法。我想如果完成的线程会发出信号,然后如果我们低于最大线程数阈值,检查器会启动一个新线程会更好。
我看到了许多线程池示例,但其中大多数不包含任何具有最大运行线程数的队列池。我的意思是,他们只是继续启动线程,直到完成。但是可以说我有 500k 的网址可以收获。我不能只在带有线程池的 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()
{
}