2009-02-10 2 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

Смежные вопросы