2010-06-16 25 views
8

Xét đoạn mã sau:Tôi xử lý ngoại lệ không đồng bộ ở đâu?

class Foo { 
    // boring parts omitted 

    private TcpClient socket; 

    public void Connect(){ 
     socket.BeginConnect(Host, Port, new AsyncCallback(cbConnect), quux); 
    } 

    private void cbConnect(IAsyncResult result){ 
      // blah 
    } 
} 

Nếu socket ném một ngoại lệ sau BeginConnect lợi nhuận và trước cbConnect được gọi là, nơi nào nó bật lên? Thậm chí nó có được phép ném vào nền không?

Trả lời

7

Mẫu mã xử lý ngoại lệ cho đại biểu đại diện từ msdn forum. Tôi tin rằng đối với mẫu TcpClient sẽ giống nhau.

using System; 
using System.Runtime.Remoting.Messaging; 

class Program { 
    static void Main(string[] args) { 
    new Program().Run(); 
    Console.ReadLine(); 
    } 
    void Run() { 
    Action example = new Action(threaded); 
    IAsyncResult ia = example.BeginInvoke(new AsyncCallback(completed), null); 
    // Option #1: 
    /* 
    ia.AsyncWaitHandle.WaitOne(); 
    try { 
     example.EndInvoke(ia); 
    } 
    catch (Exception ex) { 
     Console.WriteLine(ex.Message); 
    } 
    */ 
    } 

    void threaded() { 
    throw new ApplicationException("Kaboom"); 
    } 

    void completed(IAsyncResult ar) { 
    // Option #2: 
    Action example = (ar as AsyncResult).AsyncDelegate as Action; 
    try { 
     example.EndInvoke(ar); 
    } 
    catch (Exception ex) { 
     Console.WriteLine(ex.Message); 
    } 
    } 
} 
+0

Lưu ý rằng Tùy chọn # 1 sẽ chặn chuỗi cho đến khi hoàn tất tác vụ. Bạn cũng có thể gọi phương thức một cách đồng bộ. Tùy chọn 2 là cách để đi đến đây ... – Marc

3

Nếu quá trình chấp nhận kết nối dẫn đến lỗi, phương pháp cbConnect của bạn sẽ được gọi. Để hoàn tất kết nối mặc dù bạn cần thực hiện cuộc gọi sau

socket.EndConnection(result); 

Tại thời điểm đó, lỗi trong quá trình BeginConnect sẽ được thể hiện trong trường hợp ngoại lệ được ném.