2012-08-09 21 views
5

tengo este código:Delegado - Excepciones No espere hasta llamar EndInvoke()

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

En muchos artículos se destaca que cuando llamo BeginInvoke, todos Exception s (aquí del método threaded) espera hasta que llamo EndInvoke y será arrojado allí. Pero no funciona, el Exception ("Kaboom") es "no controlado" y el programa falla. ¿Me puedes ayudar?

Gracias!

+0

Tendrá que explicar qué tiene de especial la configuración de su depurador. Como mínimo documente lo que ve Debug + Exceptions. Desactive todas las casillas de verificación allí. –

Respuesta

4

Eso funciona bien. Cuando dices "y el programa falla", me pregunto si acabas de configurar el IDE para romper todas las excepciones. No me estrello con eso, escribe "Kaboom" en la consola, como era de esperar. Intente ejecutarlo fuera del IDE o presionando ctrl + f5 en lugar de solo f5.

Creo que sólo está viendo el IDE de ser "útil":

enter image description here

ignorar que; el IDE no siempre lo hace bien. Eso todavía se maneja.

+0

Gracias :) Tenía la misma ventana ... Pero cuando creo mi framework y cargo el DLL a mi programa, una Excepción "desconocida" detendrá el programa, esto no es lo que debería hacer un framework ... –

+1

@Luca es el depurador, no el marco. Puede desactivarlo en el menú de opciones, IIRC –

+0

Sí, pero .NET también funciona con métodos asíncronos y puedo detectar las excepciones llamando a EndInvoke con las mismas configuraciones de depurador ... –

Cuestiones relacionadas