2010-06-16 140 views
8

考慮下面的代碼:我在哪裏處理異步異常?

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 
    } 
} 

如果socketBeginConnect返回拋出異常之前cbConnect被調用,在它彈出?它甚至被允許拋出背景嗎?

回答

7

來自msdn forum的異步委託異常處理的代碼示例。我相信對於TcpClient模式將是相同的。

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

請注意,選項#1將阻止線程,直到動作完成。你也可以同步調用該方法。選項2是去這裏的路... – Marc 2013-09-08 11:59:43

3

如果接受連接的過程導致錯誤,則將調用cbConnect方法。爲了完成連接,雖然你需要做以下電話

socket.EndConnection(result); 

此時在BeginConnect過程中的誤差會拋出異常表現出來。