Discussione:
Eccezioni generate da chiamate asincrone
(troppo vecchio per rispondere)
John Skandar
2008-08-03 20:01:50 UTC
Permalink
Su internet ho trovato un WebService per un convertitore di valuta. Ho usato
il tool WSDL per generare una classe per usarlo in Visual C#.
Chiamo il metodo asincrono della classe in questo modo:

converter.ConversionRateAsync((Currency)fromCurrencyComboBox.SelectedIndex,
(Currency)toCurrencyComboBox.SelectedIndex);

Dove devo inserire l'istruzione catch? Se qualcosa non va (ad esempio il pc
non è connesso e quindi l'indirizzo del server non è raggiungibile),
l'eccezione non viene generata direttamente dall'istruzione, quindi non
basta rinchiuderla in un blocco try/catch, in quanto in realtà l'eccezione è
generata in un altro thread.

----
Dr. John Skandar
<***@msn.com>
Mauro Servienti [MVP]
2008-08-04 05:05:44 UTC
Permalink
Ciao John Skandar,

per cortesia non fare cross-posting altrimenti non si capisce più
nulla.

.m
--
Mauro Servienti
Microsoft MVP - Visual C# / MCP
http://mvp.support.microsoft.com
http://blogs.ugidotnet.org/topics
whynot [ at ] topics [ dot ] it
Mauro Servienti [MVP]
2008-08-04 05:06:57 UTC
Permalink
Ciao John Skandar,
Post by John Skandar
Su internet ho trovato un WebService per un convertitore di valuta. Ho usato
il tool WSDL per generare una classe per usarlo in Visual C#.
converter.ConversionRateAsync((Currency)fromCurrencyComboBox.SelectedIndex,
(Currency)toCurrencyComboBox.SelectedIndex);
l'evento *MethodName*Completed dovrebbe esporre negli arguments anche
una eventuale Exception generata durante l'elaborazione.

Okkio che vado proprio a memoria ;-)
Post by John Skandar
----
Dr. John Skandar
.m
--
Mauro Servienti
Microsoft MVP - Visual C# / MCP
http://mvp.support.microsoft.com
http://blogs.ugidotnet.org/topics
whynot [ at ] topics [ dot ] it
Matteo Migliore
2008-08-04 00:41:01 UTC
Permalink
Post by John Skandar
Dove devo inserire l'istruzione catch? Se qualcosa non va (ad esempio il
pc non è connesso e quindi l'indirizzo del server non è raggiungibile),
l'eccezione non viene generata direttamente dall'istruzione, quindi non
basta rinchiuderla in un blocco try/catch, in quanto in realtà l'eccezione
è generata in un altro thread.
Puoi intercettare le exception generate da thread secondari tramite
AppDomain.CurrentDomain.UnhandledException:
---------------------------------------------------------
internal static class Program
{
[STAThread]
private static void Main()
{
AppDomain.CurrentDomain.UnhandledException += new
UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.ThreadException += new
ThreadExceptionEventHandler(Application_ThreadException);

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}

private static void CurrentDomain_UnhandledException(object sender,
UnhandledExceptionEventArgs e)
{
ManageException((Exception)e.ExceptionObject);
}

private static void Application_ThreadException(object sender,
ThreadExceptionEventArgs e)
{
ManageException(e.Exception);
}

private static void ManageException(Exception exception)
{
string error = string.Format("An error accourrs.\n\nError\n{0}",
exception.Message);
MessageBox.Show(error, "Error occurred", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
---------------------------------------------------------

Leggi anche questo articolo:
http://www.codeproject.com/KB/cs/AsynchronousCodeBlocks.aspx
--
Matteo Migliore
http://blogs.ugidotnet.org/matteomigliore
Loading...