18.4. Being Notified of the Completion of an Asynchronous Delegate
Problem
You need a way of receiving notification from an asynchronously invoked delegate that it has finished. This scheme must allow your code to continue processing without having to constantly call IsCompleted
in a loop or to rely on the WaitOne
method. Since the asynchronous delegate will return a value, you must be able to pass this return value back to the invoking thread.
Solution
Use the BeginInvoke
method to start the asynchronous delegate, but use the first parameter to pass a callback delegate to the asynchronous delegate, as shown in Example 18-3.
Example 18-3. Getting notification on completion of an anonymous delegate
using System; using System.Threading; public class AsyncAction2 { public void CallbackAsyncDelegate( ) { AsyncCallback callBack = DelegateCallback; AsyncInvoke method1 = TestAsyncInvoke.Method1; Console.WriteLine("Calling BeginInvoke on Thread {0}", Thread.CurrentThread.ManagedThreadId); IAsyncResult asyncResult = method1.BeginInvoke(callBack, method1); // No need to poll or use the WaitOne method here, so return to the calling // method. return; } private static void DelegateCallback(IAsyncResult iresult) { Console.WriteLine("Getting callback on Thread {0}", Thread.CurrentThread.ManagedThreadId); AsyncResult asyncResult = (AsyncResult)iresult; AsyncInvoke method1 = (AsyncInvoke)asyncResult.AsyncDelegate; int retVal = method1.EndInvoke(asyncResult); Console.WriteLine("retVal (Callback): " + ...
Get C# 3.0 Cookbook, 3rd Edition 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.