c#来自计时器句柄问题的新线程

时间:2011-04-16 13:52:57

标签: c# multithreading handle

我正在尝试以下代码

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允许的时间之一?

2 个答案:

答案 0 :(得分:4)

  

计时器的tick属性是2ms

首先,你的计时器不会遵守此规定。分辨率约为20毫秒。

但是对于Webrequest来说,即使20毫秒也不算长。如果你的checkThread超过20毫秒(时不时),那么你将比他们完成的更快地启动线程。所以他们堆积起来。需要几个小时的事实让我觉得这是最可能的原因。

您可以使用调试器或简单的计数器activeThreads(使用Interlocked)来诊断它。

使用ThreadPool或TPL(Fx4)可以解决您的一些问题,但您仍需要检查并限制同时请求的数量。

答案 1 :(得分:2)

你应该让框架处理线程,而不是使用ThreadThreadPool.QueueUserWorkItem