2010-12-06 134 views
6

您是否有一个想法:如何在应用程序的主线程中捕获在特定线程中抛出的异常?捕获未处理的线程异常

例如,我有一个非常简单的线程做一些基本的东西:

try 
     { 
      Thread t = new Thread(new ThreadStart(Cache.initialize)); 
      t.Start(); 
      t.Name = "loading"; 
      while (t.IsAlive) 
      { 
       progressBar1.PerformStep(); 
      } 
     } 

     catch (PropertyOrFieldNotInitializedException ex) 
     { 
      Console.WriteLine(ex.StackTrace); 
      MessageBox.Show("L'application ne peut se connecter au serveur, vérifiez votre connexion"); 
     } 

的问题是,这个前提条件是没用的,因为异常不会在主堆栈中检索..

public static void initialize() 
     { 
      try 
      { 
       ctxMdv = new ClientContext(Configuration.getInstance().UrlMdv); 
       ...     
      } 

      catch (PropertyOrFieldNotInitializedException e) //si le serveur n'est pas démarré 
{ 
       throw ; 
      } 

这里的一切都停在“扔”,没有任何处理,即使在主堆栈中,我试图捕获它显示一个消息框。 那么我怎么能捕捉到我的线程中引发的这个PropertyOrFieldNotInitializedException? 你会有一些最佳做法,以捕捉c#中的线程异常?

非常感谢!

PS:好吧这要归功于以下托尔斯滕·迪特马给出了答案,我可以把它这样工作: 这里是主线程

BackgroundWorker bw = new BackgroundWorker(); 
     bw.WorkerReportsProgress = true; 
     bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
     bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
     bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
     bw.RunWorkerAsync(); 

这里是我的DoWork:

private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     Cache.initialize(); // the thread job 
    } 

即使发生异常,也会发生这种情况:

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (!(e.Error == null)) 

      if (e.Error is WebException) 
       Console.WriteLine(e.Error.StackTrace); 
      MessageBox.Show("L'application ne peut se connecter au serveur, vérifiez votre connexion"); 

     this.Dispose(); 
     Application.Exit(); 
    } 

我打算处理ProgressChanged委托来纠正进度条...;) 谢谢!

回答

4

那么,一个办法是在你的情况下使用,而不是BackgroundWorker线程。在那里你不需要try块,因为错误将被自动捕获并传递给工人结束时分配的处理程序。

编辑:
您还可以使用事件的BackgroundWorker报告进度到表单,所以您可以更新进度条正确;-)

+0

好呀!它正在工作!非常感谢你 ! 谢谢你,我会编辑我的贴子发布解决方案代码 – KitAndKat 2010-12-06 11:19:50

相关问题