2012-08-09 8 views
5

ho questo codice:Delegato - Eccezioni non aspettare fino a quando chiama 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); 
     } 
    } 
} 

In molti articoli stand che quando chiamo BeginInvoke, tutti Exception s (qui dal metodo threaded) attendere che io chiamo EndInvoke e verrà lanciato lì. Ma non funziona, lo Exception ("Kaboom") è "non gestito" e il programma si blocca. Potete aiutarmi?

Grazie!

+0

Avrete bisogno di spiegare cosa c'è di speciale nella configurazione del debugger. Per lo meno documenta ciò che vedi Debug + Eccezioni. Spegni tutte le caselle di controllo lì. –

risposta

4

Ciò funziona correttamente. Quando dici "e il programma si chiude inaspettatamente", mi chiedo se hai appena impostato l'IDE su tutte le eccezioni. Non ho problemi con questo: scrive "Kaboom" sulla console, come ci aspetteremmo. Provare a eseguirlo all'esterno dell'IDE o premendo ctrl + f5 anziché solo f5.

Penso che si sta solo vedendo l'IDE di essere "utile":

enter image description here

ignorarlo; l'IDE non sempre lo fa bene. Questo è ancora gestito.

+0

Grazie :) Ho avuto la stessa finestra ... Ma quando creo il mio framework e carico la DLL sul mio programma, un'eccezione "sconosciuta" interromperà il programma, questo non è ciò che un framework dovrebbe fare ... –

+1

@Luca è il debugger, non il framework. Puoi spegnerlo nel menu opzioni, IIRC –

+0

Sì, ma .NET funziona anche con metodi asincroni e posso catturare le eccezioni chiamando EndInvoke con le configurazioni del debugger SAME ... –

Problemi correlati