2010-02-18 11 views
9

Ho il seguente problema. FindRoot è in realtà in una DLL di terze parti e non ho il controllo su di esso. Dev'essere chiamato tramite Begin invocare. A volte, il metodo FindRoot genera un'eccezione. Ciò causa il blocco dell'intera applicazione. Ora come faccio a prevenire l'arresto anomalo della mia applicazione anche se FindRoot genera un'eccezione.BeginInvoke genera l'eccezione

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

} 

risposta

8

Utilizzare un callback anziché direttamente chiamando 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: sembra a me come si sta già chiamando questo codice da un thread in background. L'avvio di un altro thread per eseguire FindRoot() sembra strano.