写了个发短信的程序,放在服务器上,分了两个线程A,BA 用来扫描数据库  发现有待发送的信息  ,就发送B  用了接收短信刚启动的时候,没问题   可是多了 大概三天左右 就不能发送了因为时间太久,没办法调试出是什么问题 还麻烦各位帮忙想想 是什么问题  

解决方案 »

  1.   


    忘记贴代码了  //感觉这里的线程应该单例的 懒  
                    threadSendSms = new Thread(new ThreadStart(synchronizationData)); //使用线程执行方法
                    //OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear);
                    threadSendSms.Start(); //启动线程                //接收短信
                    threadReciveSms = new Thread(new ThreadStart(reciveSms));
                    threadReciveSms.Start();
      

  2.   


       private void synchronizationData()
            {
               
                //socket = 1;
                if (socket > 0)
                {
                    while (true)  
                    {
                        DateTime startTime = DateTime.Parse("07:30");
                        DateTime endTime = DateTime.Parse("22:30");
                        DateTime nowTime = DateTime.Now;
                        if (nowTime > startTime && nowTime < endTime)
                        {
                            //查询未发送的并且是没有取消发送的 发送者未删除 待发短信未删除
                            List<RuiHuaOA.Model.Sendsms> list = sendsms.getInfoReadyToSend(null);
                            #region 循环发送                        
                        }
                        //Update.updateInfo(list);
                    }
                }
                else
                {
                 
                }
            }
      

  3.   

    服务程序应该写log,方便自己了解程序的运行情况
      

  4.   

    代码看不出什么问题,加上try
    另外,把下面两行代码提到while外面,不需要每次都转换
    DateTime startTime = DateTime.Parse("07:30");
    DateTime endTime = DateTime.Parse("22:30");再另外,在while里加一条System.Threading.Thread.Sleep(1);
      

  5.   

    看看资源消耗情况,记录操作日志
    try catch
      

  6.   


    谢谢你的回答 不过你能解释一下为什么要加上  System.Threading.Thread.Sleep(1);  吗
      

  7.   

    1)加日志,记录运行状态
    2)可能是线程阻塞了,如果你的服务器上装有VS可调试,尝试这样处理:调试模式下,程序一启动就新开一个线程,做简单的While+Sleep.
    在程序运行中这个线程会一直在运行.
    几天之后,如果发现你的程序挂起,在Sleep处设置断点,
    当断点停住时,通过VS的查看当前线程功能(Debug->Windows->Threads),
    可以看到到底是哪个线程挂起,或者说具体执行到哪一步挂起.你可以尝试一下.
      

  8.   

    我想代码运行了三天都没出现问题,那说明逻辑是没有问题的,应该是你的代码没有对异常进行处理或没有一个好的异常处理机制和容错机制。
    自动运行的无人值守程序,往往对稳定性要求比较高,你要充分的考虑到网络异常、数据库异常、甚至机器DOWN机等异常时怎么办。
    为了保证线程不会崩溃,往往在线程方法里存在两个try,第一个是线程方法的第一行到线程方法的最后一行,第二个在线程循环内的第一行到循环体的最后一行。
    出来异常一定要把异常堆栈(不是message)记录下来
    另外还需要在应用程序级和应用程序域级加入异常捕获(记不清楚了,好似是Application.ThreadException和AppDomain.UnhandledException,自己查查吧!),这两个捕获是为了捕获我们程序当中未处理或忘记处理的异常的。
      

  9.   

    再加个另外,什么情况下会出现socket <= 0?
    if (socket > 0)这个条件是不是应该放到while里面?
      

  10.   

    养成连接后sleep的习惯,我一般sleep15ms。
    查询你的程序运行日志,看看是哪儿报错了。运行到何处停止了。最好把你的vs调试3天看看。
      

  11.   

    是子线程运行出错了,抛出到主线程,导致程序出错,一般能在计算机管理器的Event Viewer中找到一个很奇怪的错误。所以写多线程的应用程序,在最外层还要包层try catch,而且catch不写任何代码。你可以做一个实验,在你的子线程中throw 一个Exception,然后会看到弹出一个对话框,你再去看看Event Viewer,找一下有没有刚才报的类似的日志。