当调用thread.abort()方法时,在msdn上讲到会产生System.Threading.ThreadAbortException,但是为什么,
我的代码是这样的public class FlashThread
    {
        Thread _stateRefresh;
        public FlashThread()
        {
            _stateRefresh = new Thread(new ThreadStart(StateRefresh));
            _stateRefresh.IsBackground = true;
            _stateRefresh.SetApartmentState(ApartmentState.STA);
            _stateRefresh.Start();
        }
        public void Close()
        {
            _stateRefresh.Abort();        
        }        
        private void StateRefresh()
        {
            FormFlash flash = new FormFlash();
            flash.ShowDialog();
        }    }
}我没有try-catch语句,它在大部分机器上运行没有报System.Threading.ThreadAbortException: Thread was being aborted.但是在有的机器上它偶尔会出现
System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Windows.Forms.UnsafeNativeMethods.GetWindowPlacement(HandleRef hWnd, WINDOWPLACEMENT& placement)
   at System.Windows.Forms.Form.UpdateWindowState()
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
是不是抛出这个异常是有条件的!

解决方案 »

  1.   

    这个异常不用理。   
      Response.Redirect和Response.End都会抛出这个异常。   
      想想一个方法可以做到终止后面的代码运行就可以明白了。   
      其内部实现肯定是这样的:   
      System.Threading.Thread.CurrentThread.Abort();   
        
      这个异常即常你catch,他也会往上继续走下去。   
      你在记录日志的时候若想忽略它可以这么做:   
      try   
      {   
      }   
      catch(System.Threading.ThreadAbortException)   
      {   
              ...不进行任何操作   
      }   
      catch(System.Exception)   
      {   
            ....记录日志   
      }
      

  2.   

    但是老大非得要把这个异常抛出和条件找到啊!
    想了几天也没有想出来,急死了!
    另外,是不是产生的System.Threading.ThreadAbortException,被.NET内部给处理了,我记得好像在c#里,如果产生的异常,不try-catch掉,就程序很有可能是会弹出这种对话框,但是为什么我没用try-catch,有大多数机器没有出现,而有少数机器弹出的这个对话框。
      

  3.   

    这个异常是.Net用来强制终止一个正在运行的线程时所采用的方法,是.Net的机制。因此,当你调用abort方法时,就会在该线程上抛出异常。你有时候没有获取到异常,可能是因为你在运行close方法前,该线程就已经终止了,也就是你的FormFlash 先关闭了。如1楼说的,你可以用try...catch...来捕获异常,但不进行任何操作。
      

  4.   

    stg609,不好意思,我是个新手,不太懂!能否解释仔细点!为啥在有的机器上这异常被明显的抛出了,产生那个错误对话框,大多数据的机器去正常执行下去了!
      

  5.   

    你在新线程中执行的是打开一个FormFlash 窗体。当一个线程所执行的内容自动结束后,会自动退出关闭线程。因此没有抛出异常的可能原因之一:就是你在显示调用你的Close方法前,新线程已经自动结束了。而自动结束的原因是因为你的FormFlash 窗体已经关闭了。原因之二:你并没有显示调用Close方法,而是直接关闭了你的主线程。因为你设置了IsBackground = true.这样的话,当主线程退出后,该线程会自动结束,且不会抛出异常。