2010-02-18 2 views
9

У меня есть следующая проблема. FindRoot фактически находится в сторонней dll, и я не контролирую его. Он должен быть вызван через Begin invoke. Иногда метод FindRoot генерирует исключение. Это приводит к сбою моего приложения. Теперь, как я могу предотвратить сбой приложения, даже если FindRoot выдает исключение.BeginInvoke throws 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); 

} 

ответ

8

Использование обратного вызова вместо прямого вызова 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: он смотрит на меня, как вы уже называют этот код из фонового потока. Начиная еще один поток для запуска FindRoot() выглядит странно.

3

Собственно исключение перехватывается и повторно брошено при вызове EndInvoke, так, чтобы поймать его, вы должны использовать попробовать вокруг вызова EndInvoke.

Вы можете найти эту статью полезной http://msdn.microsoft.com/en-us/magazine/cc163467.aspx