Hi,
C# 做了一个Winform程序,定时 5S 上报数据给另一个系统,现在没有思路,到底是不是资源未释放导致,可是Timer 只new了一次,读文件的reader读完后也有close(),唯一怀疑点是Timer没有释放掉,已经做了LOCK保证只有一个线程,可是只new Timer一次长时间占用需要释放吗?我Timer有Close()
请大神们给思路?感谢!
1. 使用System.Timer.Timer ,定时去TextReader读一个文件夹里面更新的CSV数据,每次读取完成后,Close()
2.刚开始时没有任何问题,可是运行1 天左右,就出现UI界面无法移动的假死现象()
3. Timer每次进入后立即stop() ,文件读取完成后Close()最后才重新start()
4. 运行1天左右出现假死,任务管理器查看
-- 程序任然Running没有未响应,
--无法正常关闭程序
--CPU使用率(20%)和内存(25M) 都是不高,应该不会是资源用尽导致的UI 卡死把
5. 整个UI只有一个主线程,没有更新任何Timer类的数据
6. Timer 是非托管资源,难道需要手动释放吗?可是我一直需要这个定时器,我该怎么办?
问题是UI主线程我还new了Timer,跑了几个月都没有问题,所以后来我在其他类中重新new了Timer 5 秒循环 上报数据给其他程序,UI 上根本没有调用新的Timer的任何数据,UI 怎么会假死
建议用ProcessExplorer之类工具监控一下句柄数等指标
已下载,可以句柄数太多,不确定是不是资源耗尽导致的
我也碰到过这个问题,有点怀疑是Timer的问题
我网上也找了很久,好像问题都指向Timer,可不确定到底哪里出问题了。
所有你最后解决问题了吗? 还是单独开了一个线程就好了
基本上是非托管资源的问题。
我也怀疑是非托管资源的问题,可是Timer 我用了2个, 其中一个没有问题, 这个怎么解释
我也遇到了....就一个窗口定时发送消息..第二天发现程序就死了
da那是我没用timmer我是线程循环跑的啊
@猝不及防: 单开一个线程跑也会出现这个问题吗?那怎么办?
@万事如意-: 定时清理,定时重启线程吧,或者直接重启这个winform
@猝不及防: 这个办法不可行的, 我这个软件重启的机会几乎为零,我想换成开线程的话会不会没有这个问题, 怎么听你的意思,开线程也有问题啊?
@万事如意-: 你试试呗,我开线程是有问题的
@猝不及防:果然开了线程还是会假死,之前用Timer 1天左右会卡住,现在单开线程3天左右会卡住,真的没有招了
@万事如意-: 定时关线程,重启线程
@万事如意-: 开线程还是卡死那就是你代码有问题了,你最好把代码贴出来,光说没意义
耗时的动作用线程去做吧,定时器和界面是一个线程,会卡主的
定时器不是和界面在一个线程
@万事如意-: 你在定时器里延时几秒模拟长时间数据处理,你看界面卡不卡,当然定时器也分界面定时器和线程定时器,无意外你应该用的界面上的,你自己模拟试试就知道了
问题依然没有解决,已经重新来线程,把UI和线程分开了
线程问题
– MaxShe 6年前@MaxShe: 可以详细说下你的见解吗?
– 万事如意- 6年前触发timer_tick事件后,关闭timer,等你要执行的步骤都走完后,再开启timer,timer.enable = false; timer.enable = true;
– 可艺 2年前