2010-12-06 30 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:以下トルステンDittmarによって与えられた答えにわかりましたおかげで、私はそれがそのように動作させることができます: ここでの主なスレッド

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ブロックは必要ありません。エラーは自動的に捕捉され、作業者の終了時に割り当てたハンドラに渡されます。

EDIT:あなたは正しく;-)

+0

大丈夫、あなたのプログレスバーを更新することができますので、あなたはまた、あなたのフォームに進捗状況を報告するためにBackgroundWorkerのイベントを使用することができます
!それは働いている!どうもありがとうございました ! あなたのおかげでソリューションコードを投稿した投稿を編集します – KitAndKat