日期:2014-05-18  浏览次数:20823 次

求教大家一个线程异常的简单老问题
代码如下
  private void button1_Click(object sender, EventArgs e)
  {
  BeginThreadX();
  }

  private Thread thread;
  public void BeginThreadX()
  {
  thread = new Thread(ExcpThread);
  thread.Start();

  }

  public void ExcpThread()
  {
  string i = "helloworld";
  throw new Exception("thread excp");
   
  }

点击按钮之后开启一个线程,在线程中抛出异常
同时在main函数中已做捕捉
  static void Main()
  {
  Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
  Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);


  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(new Form1());

  Application.ThreadException -= new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
  AppDomain.CurrentDomain.UnhandledException -= new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

  }

这时候虽然有捕捉到异常,可还是一样会程序崩溃(ctrl+f5)运行下
如果F5调试,就是个不断抛异常的循环过程,这个太奇妙了

网上都说只要ThreadException ,UnhandledException 抓下就行了,实际好像不行
求教大家看看

------解决方案--------------------
这个问题应该是你创建的thread throw exception, 但你没有处理,clr会将这个exception抛给process,process中也没有处理,所以,最后process直接退出。
一般,写多线程,都应该处理exception。
例如:
C/C++ code

public void BeginThreadX()
        {
            Task<string> task = new Task<string>(ExcpThread);

            task.ContinueWith(tempTask => 
            {
                try
                {
                    MessageBox.Show(tempTask.Result);
                }
                catch (AggregateException ex)
                {
                    MessageBox.Show("Got error");
                }
            });

            task.Start();
        }

        public string ExcpThread()
        {
            this.textBox2.Text = "test";
            string i = "helloworld";
            throw new Exception("thread excp");
        }