温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何实现WCF回调

发布时间:2021-11-03 14:44:45 来源:亿速云 阅读:118 作者:小新 栏目:编程语言

这篇文章主要为大家展示了“如何实现WCF回调”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现WCF回调”这篇文章吧。

由于WCF回调方法并非运行在主线程中,如果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);   }

在调用异步方法时,由于对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回调”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

wcf
AI