转载网络代码.版权归原作者所有.....
客户端调用WCF的几种常用的方式:1普通调用var factory = new DataContent.ServiceReference1.CustomerServiceClient();factory.Open();List<DataContent.ServiceReference1.Customer> lis = factory.GetAllCustomerList();factory.Close();2 异步调用 1 var factory = new DataContent.ServiceReference1.CustomerServiceClient();IAsyncResult anynRsult = factory.BeginGetAllCustomerList(null, null);List<DataContent.ServiceReference1.Customer> lis = factory.EndGetAllCustomerList(anynRsult);factory.Close();
该方法将会阻塞当前线程并等待异步方法的结束,往往不能起到地多线程并发执行应有的作用。我们真正希望的是在异步执行结束后自动回调设定的操作,这样就可以采用回调的方式来实现这样的机制了。
在下面的代码中,我们通过一个匿名方法的形式定义回调操作,由于在回调操用中输出运算结果时需要使用到参与运算的操作数,我们通过BeginGetAllCustomerList方法的最后一个object类型参数实现向回调操作传递数据,在回调操作中通过IAsyncResult对象的AsyncState获得。
2 var factory = new DataContent.ServiceReference1.CustomerServiceClient();factory.BeginGetAllCustomerList(delegate(IAsyncResult asyncResult){lis = factory.EndGetAllCustomerList(asyncResult);factory.Close();}, null);
3通信工厂
var factory = new ChannelFactory<DataContent.ServiceReference1.ICustomerService>(new BasicHttpBinding(), new EndpointAddress("http://localhost:10625/Service1.svc"));try{var proxy = factory.CreateChannel();using (proxy as IDisposable){return proxy.GetAllCustomerList();}}catch (Exception ex){Console.WriteLine(ex.Message);return new List<DataContent.ServiceReference1.Customer>();}finally{factory.Close();}
4 通过事件注册的方式进行异步服务调用
var factory = new DataContent.ServiceReference1.CustomerServiceClient();factory.GetAllCustomerListCompleted += (sender, e) =>{lis = e.Result;};factory.GetAllCustomerListAsync();factory.Close();
在这里做个备注:防止下次忘记