15.6. Being Notified of the Completionof an Asynchronous Delegate
Problem
You need a way of receiving
notification from an asynchronously invoked delegate that it has
finished. However, it must be more flexible than the notification
schemes in the previous two recipes (Recipe 15.4 and Recipe 15.5). 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:
using System; using System.Threading; public class AsyncAction { public void CallbackAsyncDelegate( ) { AsyncCallback callBack = new AsyncCallback(DelegateCallback); AsyncInvoke method1 = new AsyncInvoke(TestAsyncInvoke.Method1); 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) { AsyncResult asyncResult = (AsyncResult)iresult; AsyncInvoke method1 = (AsyncInvoke)asyncResult.AsyncDelegate; int retVal = method1.EndInvoke(asyncResult); Console.WriteLine("retVal (Callback): " + retVal); } }
This callback delegate will call the
DelegateCallback
method on the thread the method was ultimately invoked ...
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.