-- From this service contract ... ---------------------------------------------- [ServiceContract] interface IFoo { [OperationContract] BazType BarOper (...); } -- A client like this is created (interface types too, which are simple) ------- public class FooClient : ClientBase, IFoo { public .ctor() public .ctor(string) public .ctor(Binding,EndpointAddress) public .ctor(string,EndpointAddress) public .ctor(string,string) public void BarOperAsync(...) public void BarOperAsync(..., object userState) { if (onBeginBarOperDelegate == null) onBeginBarOperDelegate = new BeginOperationDelegate (OnBeginBarOper) if (onEndBarOperDelegate == null) onEndBarOperDelegate = new EndOperationDelegate (OnEndBarOper) if (onBarOperCompletedDelegate == null) onBarOperCompletedDelegate = new SendOrPostCallback (OnBarOperCompleted); InvokeAsync (onBeginBarOperDelegate, new object [] {arg1, arg2, ...}, onEndBarOperDelegate, onBarOperCompletedDelegate, userState); } protected IFoo CreateChannel() [ml] IAsyncResult IFoo.BeginBarOper(..., AsyncCallback, object) { return base.BeginInvoke ("BarOper", new object [] {arg1, arg2, ...}, callback, state); } BazType IFoo.EndBarOper(IAsyncResult , out ...) { object [] ret = EndInvoke ("BarOper", result); /*optionally*/ outArg1 = ret [1]; outArg2 = ret [2] ... return (BazType) ret [0]; } private void OnBarOperCompleted(object state) { if (BarOperCompleted != null) { var args = (InvokeAsyncCompletedEventArgs) state; BarOperCompleted (new BarOperCompletedEventArgs (args.Results, args.Error, args.Cancelled, args.UserState)); } } private IAsyncResult OnBeginBarOper(object [] inValues, AsyncCallback, object) { var arg1 = inValues [0]; var arg2 = inValues [1]; ... return BeginBarOper (arg1, arg2, ..., callback, state); } private object [] OnEndBarOper(IAsyncResult) { xxx outarg1; yyy outarg2; ... var ret = EndBarOper (result, out outarg1, out outarg2, ...); return new object [] {ret, outarg1, outarg2...}; } public event EventHandler BarOperCompleted private SendOrPostCallback onBarOperCompletedDelegate private ClientBase.BeginOperationDelegate onBeginBarOperDelegate private ClientBase.EndOperationDelegate onEndBarOperDelegate public class BarOperCompletedEventArgs : AsyncCompletedEventArgs { public BarOperCompletedEventArgs (object [] results, Exception ex, bool cancelled, object userState) { this.results = results; } object [] results; public BazType Result { get { (BazType) results [0]; } } } }