2010-06-16 3 views
8

Si consideri il seguente codice:Dove gestisco le eccezioni asincrone?

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

Se socket genera un'eccezione dopo BeginConnect rendimenti e prima cbConnect viene chiamato, dove viene pop-up? E 'anche permesso di gettare sullo sfondo?

risposta

7

Esempio di codice di gestione delle eccezioni per il delegato asynch da msdn forum. Credo che per il pattern TcpClient sarà lo stesso.

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

Si noti che l'opzione n. 1 bloccherà il thread fino a quando l'azione non sarà completata. Si potrebbe anche chiamare il metodo in modo sincrono. L'opzione 2 è il modo per andare qui ... – Marc

3

Se il processo di accettazione di una connessione genera un errore, verrà chiamato il metodo cbConnect. Per completare il collegamento anche se avrete bisogno di fare la seguente chiamata

socket.EndConnection(result); 

A quel punto l'errore nel processo di BeginConnect si manifesterà in un'eccezione generata.