CHAPTER 19 MULTITHREADED, PARALLEL, AND ASYNC PROGRAMMING
public sealed class BinaryOp : System.MulticastDelegate
{
...
// Used to invoke a method asynchronously.
public IAsyncResult BeginInvoke(int x, int y,
AsyncCallback cb, object state);
}
// Used to fetch the return value
// of the invoked method.
public int EndInvoke(IAsyncResult result);
The first set of parameters passed into BeginInvoke() will be based on the format of the C# delegate
(two integers, in the case of BinaryOp). The final two arguments will always be System.AsyncCallback and
System.Object. You’ll examine the role of these parameters shortly; for the time being, though, I’ll supply
null for each. Also note that the return value of EndInvoke() is an integer, based on the return type of
BinaryOp, while the single parameter of this method is always of type IAsyncResult.
The System.IAsyncResult Interface
The BeginInvoke() method always returns an object implementing the IAsyncResult interface, while
EndInvoke() requires an IAsyncResult-compatible type as its sole parameter. The IAsyncResultcompatible object returned from BeginInvoke() is basically a coupling mechanism that allows the
calling thread to obtain the result of the asynchronous method invocation at a later time via
EndInvoke(). The IAsyncResult interface (defined in the System namespace) is defined as follows:
public interface IAsyncResult
{
object AsyncState { get; }
WaitHandle AsyncWaitHandle { get; }
bool CompletedSynchronously { get; }
bool IsCompleted { get; }
}
In the simplest case, you are able to avoid directly invoking these members. All you have to do is
cache the IAsyncResult-compatible object returned by BeginInvoke() and pass it to EndInvoke() when
you are ready to obtain the result of the method i