У меня есть следующая проблема. FindRoot находится на самом деле в третьем лице dll, и я не управляю им. Через это нужно назвать, Начинаются, вызывают. Иногда, метод FindRoot выдает исключение. Это заставляет мое целое приложение отказывать. Теперь, как я препятствую тому, чтобы мое приложение отказало, даже если FindRoot выдает исключение.
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);
}
Используйте обратный вызов вместо прямого вызова 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);
}
}
Кстати: мне кажется, что вы уже вызываете этот код из фонового потока. Запуск еще одного потока для запуска FindRoot () выглядит странно.
На самом деле исключение перехватывается и повторно генерируется, когда вы вызываете EndInvoke, поэтому, чтобы поймать его, вам нужно использовать try при вызове EndInvoke.
Вы можете найти эту статью полезной http://msdn.microsoft.com/en-us/magazine/cc163467.aspx