首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求教大家一个线程错误的简单老有关问题

2012-08-29 
求教大家一个线程异常的简单老问题代码如下private void button1_Click(object sender, EventArgs e){Begi

求教大家一个线程异常的简单老问题
代码如下
  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");        } 

热点排行