2010-02-18 53 views
9

Tôi gặp sự cố sau. FindRoot thực sự nằm trong dll của bên thứ ba và tôi không có quyền kiểm soát nó. Nó phải được gọi qua Begin gọi. Đôi khi, phương thức FindRoot ném ngoại lệ. Điều này làm cho toàn bộ ứng dụng của tôi bị lỗi. Bây giờ làm thế nào để ngăn chặn ứng dụng của tôi bị rơi ngay cả khi FindRoot ném ngoại lệ.BeginInvoke ném ngoại lệ

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

} 

Trả lời

8

Sử dụng một callback thay vì trực tiếp gọi 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: có vẻ với tôi như bạn đã gọi mã này từ một sợi nền. Bắt đầu từ một thread khác để chạy FindRoot() có vẻ lạ.

3

Thực tế ngoại lệ bị phát hiện và bị ném lại khi bạn gọi EndInvoke, vì vậy để bắt nó, bạn cần sử dụng thử xung quanh cuộc gọi đến EndInvoke.

Bạn có thể tìm thấy bài viết này hữu ích http://msdn.microsoft.com/en-us/magazine/cc163467.aspx