2011-04-16 22 views
1

林用下面的代码C#新的线程

private void timer1_Tick(object sender, EventArgs e) 
    { 

     Thread nT = new Thread(new ThreadStart (checkThread)); 
     nT.Start(); 


    } 

的cheackThread()函数进行网络请求和计时器的滴答声特性试验是2000毫秒。 checkThread()中的所有对象在使用后都会被丢弃。当程序长时间运行(例如3小时)时,操作系统会抱怨资源不足。我注意到在ctrl-alt-delete中,应用程序运行时句柄数量正在增加。线程在执行完所有代码后是不是自动释放内存,或者这是gc.collect被允许的时间之一?

+0

'checkThread'方法是否正常退出,即它总是释放其资源? – 2011-04-16 13:55:33

+0

我处理checkThread方法中使用的对象,如: reader.Close(); dataStream.Close(); response.Close(); dataStream.Dispose(); – brux 2011-04-16 13:56:57

+0

不要使用'Close()'。将它们放在'use(){}'块中以保证异常安全。 – 2011-04-16 14:20:15

回答

4

计时器的滴答属性为2ms

首先线程,你的计时器将不遵守这一点。分辨率约为20毫秒。

但是即使是20毫秒也不是很长的Webrequest。如果你的checkThread超过了20ms(每隔一段时间),那么你会比他们能够完成的更快地启动线程。所以他们堆积起来。事实上,这需要几个小时,这让我认为这是最可能的原因。

您可以使用调试器或简单计数器activeThreads(使用联锁)来诊断此问题。

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

+0

谢谢我现在要试验这个 – brux 2011-04-16 15:35:21

+0

实际上我的意思是2秒钟:O – brux 2011-04-16 15:37:25

+0

@brux:2秒听起来更合理,但我的基本论点保持不变20ms将用于本地服务器。 – 2011-04-16 15:52:51