我正在尝试以下代码
private void timer1_Tick(object sender, EventArgs e)
{
Thread nT = new Thread(new ThreadStart (checkThread));
nT.Start();
}
cheackThread()函数执行web请求,计时器的tick属性为2000ms。 checkThread()中的所有对象在使用后都会被丢弃。当程序运行很长时间,例如3小时,操作系统抱怨资源不足。我注意到在ctrl-alt-delete中,当应用程序运行时,句柄计数会增加。一旦执行了所有代码,线程是否不会自动释放内存,或者这是gc.collect允许的时间之一?
答案 0 :(得分:4)
计时器的tick属性是2ms
首先,你的计时器不会遵守此规定。分辨率约为20毫秒。
但是对于Webrequest来说,即使20毫秒也不算长。如果你的checkThread超过20毫秒(时不时),那么你将比他们完成的更快地启动线程。所以他们堆积起来。需要几个小时的事实让我觉得这是最可能的原因。
您可以使用调试器或简单的计数器activeThreads
(使用Interlocked)来诊断它。
使用ThreadPool或TPL(Fx4)可以解决您的一些问题,但您仍需要检查并限制同时请求的数量。
答案 1 :(得分:2)
你应该让框架处理线程,而不是使用Thread
去ThreadPool.QueueUserWorkItem