2010-12-06 27 views
6

Birinizin, belirli bir iş parçacığında atılan bir özel durumun uygulamada nasıl yakalanacağı hakkında bir fikri var mı? ÖrneğinBir iş parçacığının işlenmemiş istisnasını yakalama

, çok basit bir iş parçacığı bazı temel şeyler yapıyor olması:

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"); 
     } 

sorun ..

istisna ana yığınında alınamaz çünkü bu yakalama, yararsız olmasıdır
public static void initialize() 
     { 
      try 
      { 
       ctxMdv = new ClientContext(Configuration.getInstance().UrlMdv); 
       ...     
      } 

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

burada her şey "atma" noktasında durur ve hiçbir şey, ana yığında bir mesaj kutusu görüntülemeyi yakalamaya çalışmış olsa bile işlenmez. Peki iş parçamda bu PropertyOrFieldNotInitializedException nasıl yakalanabilir? C# içinde bir iş parçacığı özel durum yakalamak için bazı en iyi uygulama var mı?

Çok teşekkür ederim!

Not: Aşağıdaki Thorsten Dittmar verdiği cevaba Tamam teşekkürler, ben bu işe yapabiliriz:

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

: Burada ana iş parçacığı burada

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(); 

benim DoWork burada o bir istisna yükseltilir bile olur, mi olayı tamamlanmış olup:

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(); 
    } 

Ve ilerleme çubuğunu düzeltmek için ProgressChanged temsilcisini işlemeyi planlıyorum ...;) teşekkür ederim!

cevap

4

Eh, tek yolu durumda bir dişin yerine BackgroundWorker kullanmak olacaktır. Hatalar otomatik olarak yakalanacak ve işçiniz bittiğinde atadığınız işleyiciye aktarılacağı için orada try bloğuna ihtiyacınız yoktur.

DÜZENLEME: Ayrıca forma ilerleme kaydedilmesine BackgroundWorker bir olay kullanabilirsiniz, bu yüzden düzgün ;-)

+0

tamam ilerleme çubuğu güncelleyebilirsiniz
! işe yarıyor ! çok teşekkür ederim ! İleti kodumu yayınladığım için gönderiimi düzenleyeceğim – KitAndKat

İlgili konular