首页 > 代码库 > WCF的异步调用
WCF的异步调用
1.服务契约
namespace Contracts{ [ServiceContract] public interface ICalculator { [OperationContract] double Add(double x,double y); }}
2.服务实现
namespace Services{ public class CalculatorService:ICalculator { public double Add(double x, double y) { return x + y; } }}
3.宿主程序
namespace Hosting{ class Program { static void Main(string[] args) { //通过配置文件获取相应的信息 using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) { host.Opened += delegate { Console.WriteLine("服务已经启动,按任意键停止"); }; host.Open(); Console.Read(); } } }}
4.服务配置文件
<configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="metadataBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:6666/calculatorservice/metadata"/> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="metadataBehavior" name="Services.CalculatorService"> <endpoint address="http://127.0.0.1:6666/calculatorservice" binding="wsHttpBinding" contract="Contracts.ICalculator" ></endpoint> </service> </services> </system.serviceModel></configuration>
5.添加服务引用
6.客户端调用(说明:利用异步方式执行服务操作,使得服务在执行过程中不会阻塞主线程,当方法执行完成后,通过AsyncCallback回调对应的方法,可以通知客户端服务执行完毕,从而使proxy.EndAdd()方法不会处于阻塞等待状态,而是等阻塞proxy.BeginAdd()执行完了再执行)
namespace Client{ class Program { static void Main(string[] args) { //通过回调的方式进行异步服务调用 //通过上面的方式进行异步调用有一个不好的地方,就是当EndAdd方法被执行的时候 //如果异步执行的方法Add没有执行结束的话,该方法将会阻塞当前线程并等待异步 //方法的结束,这样往往不能起到多线程并发执行应有的作用。我么真正希望的是在 //异步执行结束后自动回调设定的操作,这样就可以采用回调的方式来实现这样的机制。 ServiceCalculator.CalculatorClient proxy = new Client.ServiceCalculator.CalculatorClient(); proxy.BeginAdd(1, 2, delegate(IAsyncResult asyncResult) {double result = proxy.EndAdd(asyncResult); proxy.Close(); Console.WriteLine("x+y={2} when x={0} and y={1}", operands[0], operands[1], result); }, null); Console.Read(); } }}
WCF的异步调用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。