
This is the Title of the Book, eMatter Edition
Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved.
1026
|
Chapter 18: Threading and Synchronization
The way that EndInvoke works in general is that it returns an object of the same type
as the return value of the delegate and has the same
out and ref parameters as the
initial delegate. An
EndInvoke method called on a delegate of the following signature:
public delegate long Foo(ref int i, out string s, bool b);
will be defined as follows:
public long EndInvoke(ref int i, out string s, IAsyncResult result)
Notice that the return type is a long and only the ref and out parameters of the origi-
nal delegate are in the signature for this method. The EndInvoke method parameters
contain only those original method parameters marked as
ref or out. The
IAsyncResult (result) is the context handed back from the initial call to BeginInvoke.
If the asynchronous delegate throws an exception, the only way to
obtain that exception object is through the
EndInvoke method. The
EndInvoke method should be wrapped in an exception handler.
Once the while loop of the PollAsyncDelegate method in this recipe is exited—mean-
ing that the asynchronous delegate has completed—the
EndInvoke method can be
safely called to retrieve the return value of the delegate as well as any
ref or out
parameter values. If you want to obtain these values, you must call the EndInvoke
method; ...