2009-02-10 19 views
6

समवर्ती सहकर्मियों से ट्रैप अपवाद।पृष्ठभूमि थ्रेड

मुझे पृष्ठभूमि अपवाद से फेंकने वाले अपवाद को फंसाने में सक्षम होना चाहिए। जो तुम वैसे भी करना चाहिए रिसाव को रोकने के लिए -

कोड (यह एक बुरा कोड है)

public delegate bool CheckForUpdatesHandler(Uri uri); 
    public class UpdatesChecker { 
     public event AsyncCompletedEventHandler CheckForUpdatesAsyncCompleted; 
     protected virtual void OnCheckForUpdatesAsyncCompleted(AsyncCompletedEventArgs args) { 
      if (CheckForUpdatesAsyncCompleted != null) 
       CheckForUpdatesAsyncCompleted(this, args); 
     } 

     public bool CheckForUpdates(Uri ftp) {    
      Thread.Sleep(1000); 
      throw new Exception("bla"); 
      return true; 
     }  


     public void CheckForUpdatesAsync(Uri ftp){    
      var action = new CheckForUpdatesHandler(CheckForUpdates); 
      var c=action.BeginInvoke(ftp, delegate(IAsyncResult state) { 
       OnCheckForUpdatesAsyncCompleted(new AsyncCompletedEventArgs(null, false, null)); 
      }, null); 
     }  
    } 

उत्तर

8
Delegate.BeginInvoke साथ

, अपवाद .EndInvoke फोन करके प्राप्त किया जा जाएगा खुद के लिए बात करते हैं।

BackgroundWorker साथ

, यह पूर्णता ईवेंट

पर दिखाई देगा एक वेनिला Thread पर, एक बिना क्रिया का अपवाद प्रक्रिया फाड़ होगा।

हालांकि, सबसे आसान तरीका है: चलो नहीं फेंक ...

public bool CheckForUpdates(Uri ftp) { 
     try { 
      Thread.Sleep(1000); 
      throw new Exception("bla"); 
      return true; 
     } catch (Exception ex) { 
      // raise an event, call a method/callback, do something 
     } 
    } 

आप वर्तमान में EndInvoke उपयोग नहीं कर रहे हैं, तो शायद ऊपर पैटर्न के लिए स्विच और बस सीधे ThreadPool का उपयोग (बल्कि Delegate.BeginInvoke से)।

+0

धन्यवाद, मार्क, आपने मेरी मदद की है :-) – Valentin

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