1.首先建立一个PollingDuplexHttpBinding对象,该绑定对象用来配置与通信的终节点,设置PollTimeout,还有InactivityTimeout。的时间. 通过PollingDuplexHttpBinding对象,可以建立一个通道工厂
---***--- IChannelFactory<IDuplexSessionChannel> factory = binding.BuildChannelFactory<IDuplexSessionChannel>(new BindingParameterCollection()) ---***---
2.通过上面建立的这个IChannelFactory<IDuplexSessionChannel>工厂对象factory ,使用factory对象的 BeginOpen 开始一个异步操作以打开通信对象。
BeginOpen(AsyncCallback, Object) --参数说明-- AsyncCallback 类型:System.AsyncCallback, 接收异步打开操作完成通知的 AsyncCallback 委托。 Object 类型:System.Object 一个由应用程序指定的对象,它包含与异步打开操作相关联的状态信息。
----------
BeginOpen会返回一个IAsyncResult,用于监视被调用方法执行的进度。 就是说BeginOpen启动异步调用时,打开了一个异步线程,而IAsyncResult就好像是一个哈希表的key,可以靠这个key去得到相应的线程,这样就可以处理多线程而不至于混乱了。 在后面的EndOpen方法,还需要传入IAsyncResult。
---***--- IAsyncResult factoryOpenResult = factory.BeginOpen(new AsyncCallback(OnOpenCompleteFactory), factory); ---***---
3.当BeginOpen操作完成后,通过IAsyncResult的.AsyncState属性得到异步操作对象,就是上面的factory对象。再调用factory对象的EndOpen方法得到异步调用的结果 这里,上面的BeginOpen后,可以随时可以调用EndOpen方法,假如异步调用还没有完成,那么EndOpen会阻塞到异步调用执行完毕
---***--- IChannelFactory<IDuplexSessionChannel> factory =(IChannelFactory<IDuplexSessionChannel>)result.AsyncState;
factory.EndOpen(result);
---***---
4.上面用EndOpen完成一个异步操作以打开通信对象后,开始建立一个通信信道。CreateChannel 用来创建到指定终结点地址的指定类型的通信信道。 建立IDuplexSessionChannel 后,打开这个通信信道和上面打开通信对象factory一样,有BeginOpen和EndOpen
---***--- IDuplexSessionChannel channel = factory.CreateChannel(new EndpointAddress("http://localhost:1419/Service1.svc")); IAsyncResult channelOpenResult = channel.BeginOpen(new AsyncCallback(OnOpenCompleteChannel), channel);
IDuplexSessionChannel channel = (IDuplexSessionChannel)result.AsyncState; channel.EndOpen(result);
---***---
未完待续----