C#中Timer的内存泄漏问题

horse_3 2010-01-20 10:47:47
用C#写了一个数据采集的程序,核心方法为TransferData(),这里包括数据的提取,分析,导入数据库。
若采用System.Threading.Timer来控制采集频率,将TransferData()做为其回调函数,内存出现只持续增长的情况。
而若将TransferData()写在一个按钮的单击事件中,去手动触发,则内存则会降下来。
大家遇到过这种情况吗?TransferData()方法里没有内存问题,找好几个经验丰富的人看过。
这个问题已经困扰好几个月了,望大家多多帮忙,小弟先谢过了。
...全文
766 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
horse_3 2011-03-20
  • 打赏
  • 举报
回复
调用的组件里有内存问题,因为组件对象一直要用,所以一直没释放。组件里每连接断开后内存会增加一点,长时间后占内存过大
poxi_nick 2010-01-20
  • 打赏
  • 举报
回复
你不会每秒做一次CheckToTransfer操作吧?
horse_3 2010-01-20
  • 打赏
  • 举报
回复
测试过了
horse_3 2010-01-20
  • 打赏
  • 举报
回复
TransferData()这里边没有内存问题
guyehanxinlei 2010-01-20
  • 打赏
  • 举报
回复
使用Timer一定要注意相关资源的释放问题。
TransferData()方法里没有内存问题?不够具体
horse_3 2010-01-20
  • 打赏
  • 举报
回复
TransferData2()的执行时间一般为30秒左右
horse_3 2010-01-20
  • 打赏
  • 举报
回复
period是1秒,下面是回调函数
private void CheckToTransfer(object noUse)
{
//如果没有处于工作中,则要去查看有没有数据要去处理
if (g_isTransfering == false)
{
//将状态设置成正在工作
g_isTransfering = true;
//如果日期没有变化,则照常工作
if (System.DateTime.Today.Day == g_preDay)
{
//看是否到刚刚在这分钟内已经读取了数据,若是这此分钟内第一次读,则继续
if (System.DateTime.Now.Minute != g_preMinite)
{
//若是此分钟是要读去数据的时间,则读取数据
if (System.DateTime.Now.Minute % 10 == 0)
{
//读取数据
TransferData2();
//读完数据后将当前时间置成上次读取数据的时间
g_preMinite = System.DateTime.Now.Minute;
}
}
}
else
{
//重新合成所要读取的文件名称、文件读取位置、所要插入的数据库表名
//先将0点之前(即昨天)10分钟的数据读入数据库(今天第一个十分钟数据还没有呢)
TransferData2();
//然后再重新初始化一些变量
if (!g_IsStartFirst)
{
InitialEveryDayVariables();
}
else
{
g_IsStartFirst = false;
}
g_preMinite = System.DateTime.Now.Minute;
g_preDay = DateTime.Today.Day;
}
g_isTransfering = false;
}
GC.Collect();
}
vrhero 2010-01-20
  • 打赏
  • 举报
回复
这不是内存泄漏问题...你Timer的period是多少?单次任务最大运行时间是多少?有没有测试过?

另外...

System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。不建议将其用于 Windows 窗体,因为其回调不在用户界面线程上进行。可以考虑使用 System.Timers.Timer,它可以引发事件并具有其他功能。
mfdipq 2010-01-20
  • 打赏
  • 举报
回复
up
zishanyan 2010-01-20
  • 打赏
  • 举报
回复
昨天刚看了一个关于timer的帖子和一些资料,发个链接吧

http://www.cnblogs.com/shang20017/archive/2009/03/16/1413798.html
为我莫属 2010-01-20
  • 打赏
  • 举报
回复
我也是新手关注中
要是我的话我可以试试写个代码
到一定时间把定时器
Enabled = false;
再Enabled= true;
不知道行不行 呵呵
看看高手都是怎么解决的吧。
丰云 2010-01-20
  • 打赏
  • 举报
回复
那就组合下,将按钮点击事件作为回调函数,呵呵
wangyue4 2010-01-20
  • 打赏
  • 举报
回复
是不是ystem.Threading.Timer间隔太短吧,用bool变量判一下上一次完没完

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧