WCF supports asynchronous programming. On the client side you can generate an async API for invoking the service using svcutil
svcutil /async <rest of command line here>
In VS 2005 you had to use the command line. In VS2008 the Add Service Reference dialog now has the Advanced button which allows you to generate the async operations

However, the fact that you can do asynchronous programming on the service side is not so obvious. You need to create the service contract according to the standard .NET async pattern of Beginxxx / Endxxx. You also need to annotate the Beginxxx method with an OperationContract that says this is part of an async pair. Note you do not annotate the Endxxx method with [OperationContract]
[ServiceContract]
interface IGetData
{
// This pair of methods are bound together as WCF is aware of the async pattern
[OperationContract(AsyncPattern=true)]
IAsyncResult BeginGetData(AsyncCallback cb, object state);
string[] EndGetData(IAsyncResult iar);
}
Now, its fairly obvious that when the request message arrives the Beginxxx bethod is called by WCF. The question is how is the Endxxx method called? WCF passes the Beginxxx method an AsyncCallback that must somehow be cached and invoked when the operation is complete. This callback triggers the call to Endxxx. Another question is "what am I meant to return from the Beginxxx method?" - where does this IAsyncResult come from? And that, unfortunately, is up to you - you have to supply one, which is a good place to cache that AsyncCallback that WCF passed you.
Here is a simple sample shows how the service side works
Async.zip (219.99 KB)
Comments, as always, welcome