2010-06-16 24 views
8

Considere el siguiente código:¿Dónde manejo las excepciones asincrónicas?

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

Si socket se emite una excepción después de BeginConnect devoluciones y antes cbConnect es llamado, ¿de dónde pop-up? ¿Está permitido arrojar en segundo plano?

Respuesta

7

Muestra de código de manejo de excepciones para el delegado asynch de msdn forum. Creo que para TcpClient el patrón será el mismo.

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

Tenga en cuenta que la Opción # 1 bloqueará el hilo hasta que se complete la acción. También podría llamar al método de forma sincrónica. La opción 2 es el camino a seguir aquí ... – Marc

3

Si el proceso de aceptación de una conexión da como resultado un error, se llamará a su método cbConnect. Para completar la conexión, aunque tendrá que hacer la siguiente llamada

socket.EndConnection(result); 

En ese momento, el error en el proceso BeginConnect se manifestará en una excepción lanzada.