好的在这里我的问题。我想开始线程,直到一定数量。让我们说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()
{
}
“我不能只是在带有线程池的for循环中启动它们。” - 你真的尝试过吗?假设它会使您的整体互联网连接速度更快,开始多线程听起来并不“合适”。另外Conisder使用异步操作 - 不需要那么多的线程......除非你有类似32核心的机器...... – 2013-03-03 03:44:15