十分诡异线程监控 或 Timer 监控失效
一,应用流程:
1,查询数据库数据
2,得到数据时生成相应的报表
3,如果没有得到数据则对数据库进行轮巡。
二,类似代码:
主方法:
Thread tn = new Thread(DoFunc);
Tn.Start()
public void DoFunc()
{
while(true)
{
Thread.Sleep(5*1000);
if(有数据)
{
//生成数据
}
}
}
执行效果:
这个服务安装到服务器,每天白天都完全正常运行,没有任何的不正常,第二天查看服务器,该服务就直接挂掉了。都不知道为什么。代码上面也没有任何异常。
个人修改:
改成Timer控件,执行同样的功能,一样会失效。
问题:
1.服务为什么会无缘无故的挂掉,代码上面我实在看不出有什么bug,而且白天都是正常的。
2.用什么来实现这样这样轮巡的功能比较好一点? 多线程 轮巡 Timer
[解决办法]
1、看try-catch能否捕捉异常。
2、参考Windows的事件日志。
[解决办法]
public void DoFunc()
{
while(true)
{
Thread.Sleep(5*1000);
if(有数据)
{
//生成数据
}
}
}
改为
public void DoFunc()
{
while(true)
{
Thread.Sleep(5*1000);
try
{
if(有数据)
{
//生成数据
}
}
catch//捕获异常,并防止因异常导致退出
{
//日志记录
}
}
}
在 7*24 小时服务中,有时会有一些意外情况,比如很多数据库都是凌晨进行大数据分析、备分、整理甚至是重启自维护,这个时候可能会数据读取超时、无法连接。对于这样的需7 * 24小时的服务程序,你必须要多做日志处理和异常捕获。
[解决办法]
你真的是写了一个windows 服务么?你的服务是自动启动么?windows服务如果异常关闭会有windows日志。
如果你只是写了个winform的exe那就别说你的这个服务如何如何了。
------解决方案--------------------
多线程,5秒就刷服务器,服务器压力承受的了吗,没准数据库吃不消,直接挂掉了
[解决办法]
3.我写成exe也是没有效果,等到零点的时候还是一样的失效。
这个应该就是原因 零点
白天长时间运行没有错误
[解决办法]
我也发现过类似问题,服务偶尔自动关闭了。没有任何征兆,但是其中有一次我明确的知道可能是因为没有访问到网络(网线不小心弄掉了)然后去看他就关闭了,所以应该是错误造成的
[解决办法]
依我猜想应该就是连接数据库失败的时候,没做处理,一直在挂着,而外层5秒连接一次,这样无限制的开线程,你想想多长时间能把服务器的资源耗尽。建议楼主写一下日志(本进程的线程数、内存使用量、等等数据)或者手动查看任务管理器。可以在你程序运行一段事件后,停止数据库服务,模拟连接不上的情况。一个一个排除总比在这里等着别人的神结果好吧。
[解决办法]
呵呵 我想说 isbackground 没设置true 然后我就想说 呵呵。。。
[解决办法]
那你可以先试试本地数据库
[解决办法]
感觉是那个5秒的问题,太短暂了,一遇到服务器卡一下就完了
[解决办法]
按道理说是不会有问题的,如果是windows服务,自己停掉了应该要在windows日志里面看到一条错误日志。你可以把while里面的catch一下,如果出错也写一个windows日志.这样应该可以查出问题了。如果是0点错误,可以在自己机器试试,是不是你的数据查询条件里面有和时间相关的,然后会出逻辑错误的地方。
[解决办法]
没有看到你有作任何异常处理,服务里面一般是作日志纪录
全局未处理异常也要捕获
用Timer就可以了,比你自己实现更可靠,跑一两个月都没问题
[解决办法]
长期运行的东西不太适合用线程,另外检查一下服务器和本地的类似360或者电脑管家这类的软件,是不是定时清理内存或者磁盘垃圾,然后顺便把你服务给干了。
[解决办法]
是的,日志很重要,建议正常运行的时候也有统计类的日志信息出来。否则不好
跟踪式什么环节的问题
[解决办法]
object o = new object();
public void DoFunc()
{
while(true)
{
Thread.Sleep(5*1000);
Lock(o)
{
if(有数据)
{
//生成数据
}
}
}
}
如果不是你的代码处理异常了,就是线程冲突导致崩溃,尤其你这个数据一边在插入修改,一边在删除修改
[解决办法]
如果按照你说的用Timer都不行,那可能不是你本身这部分代码的问题,我试过用Timer每秒去查询运行好久都没有挂过。
------解决方案--------------------
如果是0点错误,可以在自己机器试试,是不是你的数据查询条件里面有和时间相关的,然后会出逻辑错误的地方。
18楼说的你可以重点看看.我感觉也是,不可能一到零点就出问题..