这篇文章主要介绍“WCF回调返回值实例分析”,在日常操作中,相信很多人在WCF回调返回值实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”WCF回调返回值实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
客户端实现WCF回调时,如果回调函数有返回值,那么该返回值类型只能为基本类型,不能为接口类型,否则服务在回调时系统无响应,***超时,不报任何错误。
由于WCF回调方法并非运行在主线程中,如果WCF回调方法需要更新与异步调用结果相关的界面,例如本例中的lbMessage控件,则需要将回调的调用封送(Marshal)到当前主程序界面的同步上下文中。我们可以使用 SynchronizationContext以及它的SendOrPostCallback委托,对调用进行封送:
利用异步方式执行服务操作,使得服务在执行过程中不会阻塞主线程,当方法执行完成后,通过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); }
在调用BeginTransferDocument()方法之后,主线程不会被阻塞,仍然可以继续执行其它工作。而当服务方法执行完毕之后,会自动调用WCF回调方法,执行方法中的内容。上述实现存在一个问题,就是对于lbMessage控件的操作。由于WCF回调方法并非运行在主线程中,如果回调方法需要更新与异步调用结果相关的界面,例如本例中的lbMessage控件,则需要将回调的调用封送(Marshal)到当前主程序界面的同步上下文中。我们可以使用 SynchronizationContext以及它的SendOrPostCallback委托,对调用进行封送:
public ExplorerClientForm() { InitializeComponent(); m_synchronizationContext = SynchronizationContext.Current; } private SynchronizationContext m_synchronizationContext; }
到此,关于“WCF回调返回值实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。