日期:2014-05-17  浏览次数:21096 次

十分诡异线程监控 或 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那就别说你的这个服务如何如何了。
------解决方案--------------------