好的,这是我的问题。我想要启动线程直到达到一定数量,比如100个。所以它会开始启动线程并持续检查正在运行的线程数量。当最大值达到时,它将停止启动新线程。但是使用适当的检查间隔或完成线程信号后,它将启动新线程。
通过这种方式,我将始终拥有特定数量的运行中的线程。
我使用sleep和permanent while来实现这一点。因此,我会在给定的间隔内不断检查总运行线程数,如果线程已经完成,则丢弃它并启动一个新线程。
但是我的解决方案不被视为正确的方式。我认为如果完成的线程发出信号,然后检查器会在我们低于最大线程阈值时启动新线程,那么会更好。
我看过许多线程池示例,但其中大部分都没有包含任何排队池,并带有最大数量的运行线程。我的意思是,它们只是一直启动线程,直到完成为止。但是,假设我有50万个要收集的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()
{
}