2010-02-18 18 views
9

Mam następujący problem. FindRoot jest rzeczywiście w dll trzeciej strony i nie mam nad nim kontroli. To musi być wywołana przez Begin invoke. Czasami metoda FindRoot zgłasza wyjątek. Powoduje to awarię całej mojej aplikacji. Jak mogę zapobiec awariom aplikacji, nawet jeśli FindRoot zgłasza wyjątek.BeginInvoke rzuca wyjątek

delegate void AddRoot(double number); 
public static void FindRoot(double number) 
{ 
    throw new Exception();/// sometimes is thrown. 

} 

static void back_DoWork(object sender, DoWorkEventArgs e) 
{ 
    AddRoot root = FindRoot; 
    root.BeginInvoke(12.0, root.EndInvoke, root); 

} 

Odpowiedz

8

użyć wywołania zwrotnego zamiast bezpośredniego wywoływania EndInvoke:

using System.Runtime.Remoting.Messaging; 
... 
static void back_DoWork() 
{ 
    AddRoot root = FindRoot; 
    root.BeginInvoke(12.0, new AsyncCallback(callback), root); 
} 

static void callback(IAsyncResult result) 
{ 
    AddRoot dlg = (AddRoot)(((AsyncResult)result).AsyncDelegate); 

    try 
    { 
     dlg.EndInvoke(result); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 

BTW: wygląda mi na to, że są już nazywając ten kod z wątku tła. Rozpoczęcie kolejnego wątku do uruchomienia FindRoot() wygląda dziwnie.

Powiązane problemy