2010-02-18 19 views
9

Tengo el siguiente problema. FindRoot está en realidad en un dll de un tercero y no tengo control sobre él. Tiene que ser llamado a través de Invocar invocación. A veces, el método FindRoot arroja una excepción. Esto hace que toda mi aplicación se cuelgue. Ahora, ¿cómo puedo evitar que mi aplicación falle incluso si FindRoot arroja una excepción?BeginInvoke arroja la excepción

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

} 

Respuesta

8

Usar una devolución de llamada en lugar de directamente llamando 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); 
    } 
} 

Por cierto: me parece que como que ya está llamando el código de un subproceso en segundo plano. Comenzar otro hilo para ejecutar FindRoot() parece extraño.

Cuestiones relacionadas