经过长时间学习WCF,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西。由于WCF回调方法并非运行在主线程中,如果WCF回调方法需要更新与异步调用结果相关的界面,例如本例中的lbMessage控件,则需要将回调的调用封送(Marshal)到当前主程序界面的同步上下文中。我们可以使用 SynchronizationContext以及它的SendOrPostCallback委托,对调用进行封送:
10多年专业网络公司历程,坚持以创新为先导的网站服务,服务超过1000+企业及个人,涉及网站设计、重庆APP软件开发、微信开发、平面设计、互联网整合营销等多个领域。在不同行业和领域给人们的工作和生活带来美好变化。
- public ExplorerClientForm()
- {
- InitializeComponent();
- m_synchronizationContext = SynchronizationContext.Current;
- }
- private SynchronizationContext m_synchronizationContext;
则WCF回调方法修改为:
- //callback method
- void OnTransferCompleted(IAsyncResult result)
- {
- Stream stream = m_service.EndTransferDocument(result);
- result.AsyncWaitHandle.Close();
- SendOrPostCallback callback = delegate
- {
- lbMessage.Text = string.Format("The file {0} had been transfered sucessfully.",
- m_doc.FileName);
- };
- m_synchronizationContext.Send(callback,null);
- }
#T#在调用异步方法时,由于对BeginTransferDocument()和EndTransferDocument()方法的调用可能会在不同的方法体中,因而我将服务代理对象定义为private字段。如果希望将服务对象定义为一个局部变量,可以在调用BeginTransferDocument() 方法时,将代理对象传递到方法的asyncState参数中,然后在调用EndTransferDocument()方法之前,通过 IAsyncResult获得准确的服务代理对象:
- m_service.BeginTransferDocument(m_doc,OnTransferCompleted,m_service);
将m_service作为asyncState对象传入之后,在调用EndTransferDocument()方法之前,就可以根据它先获得服务代理对象:
- IDocumentsExplorerService m_service = result.AsyncState as IDocumentsExplorerService;
- Stream stream = m_service.EndTransferDocument(result);
- //rest codes
新闻标题:老鸟谈WCF回调使用方法
文章分享:http://www.shufengxianlan.com/qtweb/news37/56487.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联