private void Form1_Load(object sender, EventArgs e)
   {
            for (int b = 0; b < 3; b++)
                    {
                        Thread thread = new Thread(new ThreadStart(sendMessage));
                        thread.IsBackground = true;
                        thread.Name = b.ToString();
                        thread.Start();
                    }
    } private static void sendMessage()
 {
  //操作数据库,并通过webservice提交到远程服务器
    GetData getdata = new GetData();    
    Record record = getdata.getNotSendMessage();
   if (record != null)
   {
       ....
        sendMessage();
   }
    else
   {
        Thread.Sleep(5000);
        sendMessage();
    }
 }代码如上,我就是这样类似一个多线程,然后无限循环,不知道为什么!
每次运行时间久了之后(一般是一天时间),程序就会报错,而且报错的貌似还不是代码的异常错误!
错误提示如下:
   XXXX 遇到问题需要关闭,我们对此引起的不便表示抱歉...
   ....
就是这样写无意义提示,任何异常捕捉都没有捕捉到,按关闭按钮程序就关了..
如果是不使用线程运行一个月都不会报错...
   private void Form1_Load(object sender, EventArgs e)
   {
          sendMessage();
   }
 private static void sendMessage()
 {
 
    GetData getdata = new GetData();    
    Record record = getdata.getNotSendMessage();
   if (record != null)
   {
       ....
        sendMessage();
   }
    else
   {
        //这里用计时器暂停5秒
        sendMessage();
    }
 }但是这样很明显效率低了好多,速度太慢...
向各位求助...

解决方案 »

  1.   

    你的错误很可能是多线程共用一个Webservice实例造成的,一个实例同时只允许一个同步操作
    解决方法:
    在线程里创建一个新的WebService即可
    //操作数据库,并通过webservice提交到远程服务器
      GetData getdata = new GetData();   
      Record record = getdata.getNotSendMessage();
      WBService s=new WBService();//创建新的WebService实例
      s.test();
      

  2.   

    是的,我本身就是这样做的,webservice服务器本身也是支持多线程..
    每次我都是重新实例化的...
      

  3.   

    查一下系统日志,一崩溃后,立刻查看系统的应用程序日志,可以看到原因
    你这个错误有可能是在WebService的并发调用上的错误,也可能是线程并发上的错误,不会是代码错误,因为共用变量出错经常会出现这样的错误 ,
    1.确定每个WebService实例是不是完全独立的(不能是静态变量,也不能是全局变量,否则实例就没意义了)
    2.是否用到其他的公共变量,比如三个线程都会去操作一个全局的变量或者静态变量,此类操作必须要加上Lock线程锁,保证线程不相互调用产生的冲突,哪怕是一个共用的变量int a++,你也必须锁住
    3.是否有回调函数导致整个系统崩溃,多线程的同步回调由于采用同一个内存区域回调,会产生这样的情况,这类情况必须加线程锁,异步回调则无关系
    4.线程方法整个内部加try catch,捕捉异常记录,看看是什么错误
      

  4.   

    无限递归,当然会出错了.sendMessage()改成死循环,不递归调用就行了.
      

  5.   

    肯定要无限递归的,不然如何从数据库读取数据并提交到远程服务器呢!
    这个winform是在服务器上运行的...
      

  6.   

    1.webservice完全是独立的一个类里面的,而且每次只要用到webservice都是直接实例化的.
    2.确实是有两个静态的全局哈希表,但是哈希表的键和值是固定的,只读不写和改的(不知道哈希表能支持多线程同时访问么,如果不行为什么总是运行一段时间后才会出问题,也没有异常捕获到).
    3.没有回调函数,只做数据库读取和访问webservice
    4.有做异常捕获,但是根本没有任何错误,包括做异常日志记录,发觉就没有查到异常日志....
    ....
    发现有点奇怪的是,每次出现异常的时候都是数据库没有可用数据的时候..大多数是半夜,或者晚上出现问题,那时候基本数据库是没有数据可访问的,也就说每次都是跳过查询数据库和访问webservice...
      

  7.   


    那就对了,试一下以下操作
    public static object objLock=new object();//声明一个全局的锁对象
    锁住后操作
    lock(objLock)
    {
    GetData getdata = new GetData();   
      Record record = getdata.getNotSendMessage();
    }
    另外,我也不建议用递归,你可以用死循环即可
    while(true)
    {
       //操作
    }
      

  8.   

    谢谢你,我再试一下,我把程序改成了
      private static GetData getdata = new GetData();
      private static void sendMessage()
            {
                while (true)
                {
                    Monitor.Enter(getdata);
                        Record record = getdata.getNotSendMessage();
                    Monitor.Exit(getdata);
    if (record != null)
                    {
                      
                     下面就是对record中的数据操作了
    }else
                    {
                        Thread.Sleep(5000);
                    }             }
    }发现如果用lock需要把整个函数给锁了才可以起作用..
    可能是我水平问题...
    但是用了Monitor又可以..
    我很怀疑就是因为递归引起的问题
      

  9.   

    private static void sendMessage()
     {
      Thread.Sleep(5000);
      sendMessage();
     }这样写不知道是个什么意思sendMessage里再执行一次sendMessage
    那么他就不会释放上一次执行的数据, 因为他没执行完毕, 所以就导致每5分钟执行一次, 并且不释放内存.
    那么执行多次后就会内存太多而发生问题
      

  10.   

    就是递归调用,想要的就是这样的效果..一直循环执行查询数据库...
    在没有使用线程的时候运行一个月都没有问题..就是因为使用了线程所以报错了..
    现在没有使用递归,改成了while(true)
      

  11.   

    while(true)这个true最好和主窗体关联, 主窗体关闭时, 这个true也变成false, 否则exe无法退出进程
      

  12.   

    用lock或者用GC回收机制 应该可以搞定吧线程的等待与释放。。