2010-12-06 12 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 को कैसे पकड़ सकता हूं? क्या आपके पास सी # में धागे से अपवाद पकड़ने के लिए कुछ बेहतरीन अभ्यास होगा?

बहुत बहुत धन्यवाद!

पुनश्च: नीचे Thorsten Dittmar द्वारा दिए गए जवाब देने के लिए ठीक है धन्यवाद, मैं इसे की तरह वह काम कर सकता है:

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

: यहाँ मुख्य थ्रेड

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

और मैं प्रोग्रेस बार को सही करने के लिए प्रोग्रेस चेंज प्रतिनिधि को संभालने की योजना बना रहा हूं ...;) धन्यवाद!

उत्तर

4

ठीक है, एक तरह से अपनी स्थिति में एक थ्रेड के बजाय BackgroundWorker उपयोग करने के लिए किया जाएगा। आपको वहां try ब्लॉक की आवश्यकता नहीं है, क्योंकि त्रुटियों को स्वचालित रूप से पकड़ा जाएगा और कार्यकर्ता समाप्त होने पर आपके द्वारा असाइन किए गए हैंडलर को पास कर दिया जाएगा।

संपादित करें:
आप भी अपनी फार्म के लिए प्रगति रिपोर्ट करने के लिए BackgroundWorker की एक घटना का उपयोग कर सकते हैं, ताकि आप अपनी प्रगति बार ठीक से ;-)

+0

ठीक अद्यतन कर सकते हैं! यह काम कर रहा है ! आपका बहुत बहुत धन्यवाद ! मैं आपके पोस्ट को आपके लिए समाधान कोड पोस्ट करने के लिए संपादित कर दूंगा – KitAndKat

संबंधित मुद्दे