5.17. Handling Exceptions Thrown from an Asynchronous Delegate
Problem
When using a delegate asynchronously, you want to be notified in the calling thread if the delegate has thrown any exceptions.
Solution
Wrap the
EndInvoke
method of the delegate in a
try
/catch
block:
using System; using System.Threading; public class AsyncAction { public void PollAsyncDelegate( ) { // Create the async delegate to call Method1 and call its BeginInvoke method AsyncInvoke MI = new AsyncInvoke(TestAsyncInvoke.Method1); IAsyncResult AR = MI.BeginInvoke(null, null); // Poll until the async delegate is finished while (!AR.IsCompleted) { System.Threading.Thread.Sleep(100); Console.Write('.'); } Console.WriteLine("Finished Polling"); // Call the EndInvoke method of the async delegate try { int RetVal = MI.EndInvoke(AR); Console.WriteLine("RetVal: " + RetVal); } catch (Exception e) { Console.WriteLine(e.ToString( )); } } }
The following code defines the AsyncInvoke
delegate and the asynchronously invoked static method
TestAsyncInvoke.Method1
:
public delegate int AsyncInvoke( ); public class TestAsyncInvoke { public static int Method1( ) { throw (new Exception("Method1")); // Simulate an exception being thrown } }
Discussion
If the code in the PollAsyncDelegate
method did
not contain a call to the delegate’s
EndInvoke
method, the exception thrown in
Method1
would simply be discarded and never caught. This behavior is by design; for all unhandled exceptions that occur within the thread, the thread immediately ...
Get C# Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.