c#新线程定时器句柄问题

本文关键字:定时器 句柄 问题 线程 新线程 | 更新日期: 2023-09-27 17:50:16

我在试验下面的代码

private void timer1_Tick(object sender, EventArgs e)
    {
        Thread nT = new Thread(new ThreadStart (checkThread));
        nT.Start();

    }

checkthread()函数执行web请求,定时器的tick属性为2000ms。checkThread()中的所有对象在使用后都会被处理掉。当程序长时间运行时,例如3小时,操作系统会抱怨资源不足。我注意到在ctrl-alt-delete中,当应用程序运行时,句柄数会增加。线程在执行完所有代码后不会自动释放内存吗?允许付费吗?

c#新线程定时器句柄问题

定时器的tick属性是2ms

首先,你的计时器不会遵守这个。分辨率为~ 20ms

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

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

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

你应该让框架处理线程,而不是使用Thread去ThreadPool。QueueUserWorkItem