我们在解决异步调用的时候可以产用WCF回调方法来解决,我在网上收集了许多资料,现在分享一下吧。合理地利用服务的异步调用,可以有效地提高系统性能,合理分配任务的执行。特别对于UI应用程序而言,可以提高UI的响应速度,改善用户体验。在我编写的应用程序中,下载的文件如果很大,就有必要采用异步方式。对于异步调用的完成,虽然WCF提供了诸如阻塞、等待和轮询等机制,但最好的方式还是使用回调。也就是利用Begin方法参数中的AsyncCallback对象。这是一个委托对象,它的定义如下所示:
创新互联是专业的独山网站建设公司,独山接单;提供成都网站设计、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行独山网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
- public delegate void AsyncCallback(IAsyncResult ar);
利用异步方式执行服务操作,使得服务在执行过程中不会阻塞主线程,当方法执行完成后,通过AsyncCallback回调对应的方法,可以通知客户端服务执行完毕。例如:
- //Invoke it Asynchronously
- m_service.BeginTransferDocument(m_doc,OnTransferCompleted,null);
- //Do some work;
- //callback method
- void OnTransferCompleted(IAsyncResult result)
- {
- Stream stream = m_service.EndTransferDocument(result);
- result.AsyncWaitHandle.Close();
- lbMessage.Text = string.Format("The file {0} had been transfered sucessfully.",
- m_doc.FileName);
- }
#T#在调用BeginTransferDocument()方法之后,主线程不会被阻塞,仍然可以继续执行其它工作。而当服务方法执行完毕之后,会自动调用WCF回调方法,执行方法中的内容。上述实现存在一个问题,就是对于lbMessage控件的操作。由于WCF回调方法并非运行在主线程中,如果回调方法需要更新与异步调用结果相关的界面,例如本例中的lbMessage控件,则需要将回调的调用封送(Marshal)到当前主程序界面的同步上下文中。我们可以使用 SynchronizationContext以及它的SendOrPostCallback委托,对调用进行封送:
- 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);
新闻标题:WCF回调方法和异步方式联合使用
转载注明:http://www.36103.cn/qtweb/news15/31565.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联