This interface is used in
asynchronous programming to act as a
placeholder for the result of the async call. It is most commonly
used when an instance of a delegate type is fired using the
BeginInvoke method. (This idiom is used
extensively throughout the .NET Framework Class Library.)
Asynchronous method calls can be harvested in a number of ways. A
programmer can poll the call by checking the
IsCompleted property of the
IAsyncResult object to see if the call has
completed yet. This, while perhaps the simplest approach, is also
likely the most wasteful, as the caller needs to be in some sort of
spin loop, repeatedly checking the property until a
true is received.
A variant of the polling spin loop is to use the
AsyncWaitHandle property of
IAsyncResult. This is a standard Win32 handle that
can be used in some of the synchronization primitives provided in the
System.Threading namespace. Specifically, this
property is a System.Threading.WaitHandle
instance, meaning that the programmer can call any of the
Wait methods: WaitOne( ),
WaitAny( ), or WaitAll( ). The
net effect is the same—put the calling thread to sleep until
the async call completes.
Although not formally part of the IAsyncResult
interface, a corresponding EndInvoke method is
supported by delegates. The EndInvoke method
blocks the calling thread until the async call completes.
Alternatively, at the point of the async delegate call, a programmer
can specify a callback delegate to call when the async call
completes. This callback, a delegate instance of type
AsyncCallback, is passed this
IAsyncResult instance as part of the call. An
optional generic argument can also be passed in as part of the async
call, and this generic argument is available on the
IAsyncResult through the
AsyncState property. For an example of using
IAsyncResult, see Section 16.3.
public interface IAsyncResult {
// Public Instance Properties
public object AsyncState{get; }
public WaitHandle AsyncWaitHandle{get; }
public bool CompletedSynchronously{get; }
public bool IsCompleted{get; }
}