Windows Service 中New Timer造成内存无止境增长的问题

lvyb062 2014-01-04 01:02:32
最近写了个Windows服务,服务跑起不到1天就会因为内存占用太大而当机。
然后我屏蔽了业务代码,仅留下new Timer的代码(如下面的代码段)
但问题依旧,所以想请教高人服务里的timer怎么使用才得当?

//百度说这个声明必须放在外部,否则会被垃圾回收
private System.Threading.Timer tMain = null;

private void ReadDev( object obj )
{
//释放tMain占用的资源
tMain.Dispose();
//。。。屏蔽的业务代码
tMain = new System.Threading.Timer( ReadDev, null, 10000, 0 );
}



//下面是一个临时方案,期待更好的解决方案。

//百度说这个声明必须放在外部,否则会被垃圾回收
private System.Threading.Timer tMain = null;

private void ReadDev( object obj )
{
//释放tMain占用的资源
tMain.Dispose();
//。。。屏蔽的业务代码

while ( /*需要重新开始ReadDev的条件*/ ) {
//。。。屏蔽的业务代码
Thread.Sleep( 10000 );
}

tMain = new System.Threading.Timer( ReadDev, null, 10000, 0 );
}
...全文
283 点赞 收藏 6
写回复
6 条回复
“回收”Timer并不会清理Timer委托中申请的内存。检查ReadDev是否有内存泄漏。 再者说,你也没有必要不断的创建Timer、销毁它。
回复 点赞
bdmh 2014年01月04日
你这个timer不会被回收,而且timer事件是一直调用创建timer的ReadDev方法,这样造成无休止的创建timer
回复 点赞
lvyb062 2014年01月04日
引用 4 楼 bdmh 的回复:
你这个timer不会被回收,而且timer事件是一直调用创建timer的ReadDev方法,这样造成无休止的创建timer
引用 5 楼 caozhy 的回复:
“回收”Timer并不会清理Timer委托中申请的内存。检查ReadDev是否有内存泄漏。 再者说,你也没有必要不断的创建Timer、销毁它。
谢谢,我上面没说清楚。 现在的代码是这样的 请帮忙看看这个ReadDev是否会一直的执行下去?
//百度说这个声明必须放在外部,否则会被垃圾回收
private System.Threading.Timer tMain = null;
 
private void ReadDev( object obj )
{
    //。。。屏蔽的业务代码
}

protected override void OnStart( string[] args ) {
    logMain.WriteEntry( "启动服务", EventLogEntryType.Information );
    //服务启动5分钟后才开始工作,为了防止比依赖服务启动的早。
    tMain = new System.Threading.Timer( ReadDev, null, 300000, 10000 );
}
回复 点赞
lvyb062 2014年01月04日
引用 1 楼 sp1234 的回复:
你每10秒钟就创建新的Timer对象干什么? 用一个Timer跑一天不就行了嘛。
哎,谢谢,你提醒了我,刚才仔细看了参数说明,现将代码修改为 tMain = new System.Threading.Timer( ReadDev, null, 0, 10000 ); 不知道这样做是否会被系统回收
回复 点赞
lvyb062 2014年01月04日
引用 1 楼 sp1234 的回复:
你每10秒钟就创建新的Timer对象干什么? 用一个Timer跑一天不就行了嘛。
这个timer在服务里只执行一次
回复 点赞
以专业开发人员为伍 2014年01月04日
你每10秒钟就创建新的Timer对象干什么? 用一个Timer跑一天不就行了嘛。
回复 点赞
发动态
发帖子
Web Services
创建于2007-09-28

1.1w+

社区成员

1.6w+

社区内容

.NET技术 Web Services
社区公告
暂无公告