2010-02-18 6 views
9

J'ai le problème suivant. FindRoot est en fait dans une DLL tierce et je n'ai aucun contrôle sur elle. Il doit être appelé via Begin invoke. Parfois, la méthode FindRoot renvoie une exception. Cela provoque le blocage complet de mon application. Maintenant, comment puis-je empêcher mon application de planter même si FindRoot déclenche une exception.BeginInvoke lève l'exception

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

} 

Répondre

8

Utilisez un rappel au lieu d'appeler directement 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: il me semble que vous appelez déjà ce code à partir d'un fil d'arrière-plan. Démarrage encore un autre thread pour exécuter FindRoot() semble étrange.

Questions connexes