首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

非常诡异线程监控 或 Timer 监控失效

2013-08-13 
十分诡异线程监控 或 Timer 监控失效一,应用流程:1,查询数据库数据2,得到数据时生成相应的报表3,如果没有

十分诡异线程监控 或 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或者电脑管家这类的软件,是不是定时清理内存或者磁盘垃圾,然后顺便把你服务给干了。
[解决办法]

引用:
没有看到你有作任何异常处理,服务里面一般是作日志纪录
全局未处理异常也要捕获
用Timer就可以了,比你自己实现更可靠,跑一两个月都没问题

是的,日志很重要,建议正常运行的时候也有统计类的日志信息出来。否则不好
跟踪式什么环节的问题
[解决办法]
object o = new object();
public void DoFunc()
{
  while(true)
  {
    Thread.Sleep(5*1000);
    Lock(o)
    {
       if(有数据)
       {
          //生成数据
       }
    }
  }
}

如果不是你的代码处理异常了,就是线程冲突导致崩溃,尤其你这个数据一边在插入修改,一边在删除修改
[解决办法]
如果按照你说的用Timer都不行,那可能不是你本身这部分代码的问题,我试过用Timer每秒去查询运行好久都没有挂过。
------解决方案--------------------


如果是0点错误,可以在自己机器试试,是不是你的数据查询条件里面有和时间相关的,然后会出逻辑错误的地方。


18楼说的你可以重点看看.我感觉也是,不可能一到零点就出问题..

热点排行