我自己手工生成了若干线程,其中有些线程老是出些异常,我就想把这些异常信息写LOG,在IDE的调试环境下似乎一切正常,但在独立运行时,有些线程的异常却没有捕捉到,程序然后就处于无响应状态,请问这是为何?
另外,请大家推荐一些多线程调试方面的书籍,有电子版下载的最好了,多谢.

解决方案 »

  1.   

    线程的异常好象是不会抛出来的,你必须在线程代码里try在catch中写文件.
      

  2.   

    要确认异常是否捕获没有,再就是你这个线程内得运算是否有陷入死循环得可能,你可以用log4net做日志来分析一下了。
      

  3.   

    线程中,每个函数的代码都包含在try/catch中,全程写日志,且尽量详细一点,至少把函数名写进去。我的多线程代码,日志代码占到了总代码量的30%,虽然这些代码执行得很少,但是,一旦发现问题,你就可以佷快的从日志中看出大概是哪些代码出问题了,调试起来就很方便。btw:多线程中,很多不稳定问题是出现在几个线程同时抢一个资源的时候。 这种问题,除了通过日志判断,别无他法。 因为在IDE中调试,跟本不会出这种问题。
      

  4.   

    这是我进程函数的标准模式:private void threadFunctionA()
    {
       try
       {
          try   //估计打开文件可能产生异常
          {
             ...  //打开一个文件
          }
          catch(Exception fileError)
          {
             writeLog("openfile error in threadFunctionA():"+fileError.message);
          }
          ......     //估计不会产生异常的代码
       }
       catch(Exception e){
          writeLog("unknow error in threadFunctionA():"+e.message);
       }
    }
    这样,通常在程序发生错误时,都会在日志中,找到错误的大概原因。不过,日志代码太多,很繁琐。 但是,在调试期,一旦出错,就会发些这些代码还是值得的
      

  5.   

    我在代码中也是如各位所说,加了许多try/catch,然后在catch中记日志,但是只在调试状态下可以捕捉到异常,然后日记也记下了,但在独立运行时却无法捕捉,日志里也没有相应记录,不知是怎么回事.
      

  6.   

    我知道遇到控件的线程安全问题,需要使用控件的Invoke方法和是beginInvoke/endInvoke,但是为什么需要这样,并且使用Invoke时,调试相当麻烦,总是不好准确定位错误.请熟悉这方面内容的高手多多指教.