老鸟谈WCF回调使用方法

开发 后端
这里就WCF回调方法做出了简单的分析,WCF回调方法需要更新与异步调用结果相关的界面,希望大家看了会有帮助。

经过长时间学习WCF,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西。由于WCF回调方法并非运行在主线程中,如果WCF回调方法需要更新与异步调用结果相关的界面,例如本例中的lbMessage控件,则需要将回调的调用封送(Marshal)到当前主程序界面的同步上下文中。我们可以使用 SynchronizationContext以及它的SendOrPostCallback委托,对调用进行封送:

  1. public ExplorerClientForm()   
  2. {   
  3. InitializeComponent();   
  4. m_synchronizationContext = SynchronizationContext.Current;   
  5. }   
  6. private SynchronizationContext m_synchronizationContext;  

则WCF回调方法修改为:

  1. //callback method   
  2. void OnTransferCompleted(IAsyncResult result)   
  3. {   
  4. Stream stream = m_service.EndTransferDocument(result);   
  5. result.AsyncWaitHandle.Close();   
  6.  
  7. SendOrPostCallback callback = delegate   
  8. {   
  9. lbMessage.Text = string.Format("The file {0} had been transfered sucessfully.",   
  10. m_doc.FileName);   
  11. };   
  12. m_synchronizationContext.Send(callback,null);   
  13. }   

#T#在调用异步方法时,由于对BeginTransferDocument()和EndTransferDocument()方法的调用可能会在不同的方法体中,因而我将服务代理对象定义为private字段。如果希望将服务对象定义为一个局部变量,可以在调用BeginTransferDocument() 方法时,将代理对象传递到方法的asyncState参数中,然后在调用EndTransferDocument()方法之前,通过 IAsyncResult获得准确的服务代理对象:

  1. m_service.BeginTransferDocument(m_doc,OnTransferCompleted,m_service); 

将m_service作为asyncState对象传入之后,在调用EndTransferDocument()方法之前,就可以根据它先获得服务代理对象:

  1. IDocumentsExplorerService m_service = result.AsyncState as IDocumentsExplorerService;   
  2. Stream stream = m_service.EndTransferDocument(result);   
  3. //rest codes   
责任编辑:田树 来源: 博客
相关推荐

2010-03-02 14:12:30

WCF枚举类型

2009-11-09 15:58:07

WCF回调方法

2010-02-23 11:06:16

WCF可信赖会话

2010-03-01 17:39:07

WCF Address

2009-11-16 17:35:38

PHP数组排序

2010-03-02 16:58:11

AJAX WCF服务项

2009-11-02 18:03:25

Oracle用户表空间

2009-12-22 19:00:08

WCF回调

2009-11-16 10:25:40

PHP上传文件

2009-11-09 17:04:20

Visual Stud

2011-02-24 13:09:10

FireFTP

2012-01-13 09:55:54

jQuery

2009-11-04 13:33:13

ADO.NET Dat

2009-12-22 16:36:38

WCF重载

2009-12-24 16:36:06

WPF InkCanv

2010-05-28 19:12:09

MySQL使用方法

2009-12-28 13:28:03

WPF视频

2011-04-08 10:43:44

2017-08-18 14:01:44

大数据dataWrangle

2009-10-30 11:07:04

VB.NET Syst
点赞
收藏

51CTO技术栈公众号