WCF回调方法和异步方式联合使用

开发 后端
文章主要利用异步方式执行服务操作,使得阻塞主线程,当方法执行完成后,通过WCF回调方法,可以通知客户端服务执行完毕。

我们在解决异步调用的时候可以产用WCF回调方法来解决,我在网上收集了许多资料,现在分享一下吧。合理地利用服务的异步调用,可以有效地提高系统性能,合理分配任务的执行。特别对于UI应用程序而言,可以提高UI的响应速度,改善用户体验。在我编写的应用程序中,下载的文件如果很大,就有必要采用异步方式。对于异步调用的完成,虽然WCF提供了诸如阻塞、等待和轮询等机制,但最好的方式还是使用回调。也就是利用Begin方法参数中的AsyncCallback对象。这是一个委托对象,它的定义如下所示:

  1. public delegate void AsyncCallback(IAsyncResult ar); 

利用异步方式执行服务操作,使得服务在执行过程中不会阻塞主线程,当方法执行完成后,通过AsyncCallback回调对应的方法,可以通知客户端服务执行完毕。例如:

  1. //Invoke it Asynchronously  
  2. m_service.BeginTransferDocument(m_doc,OnTransferCompleted,null);  
  3. //Do some work;  
  4. //callback method  
  5. void OnTransferCompleted(IAsyncResult result)  
  6. {  
  7. Stream stream = m_service.EndTransferDocument(result);  
  8. result.AsyncWaitHandle.Close();  
  9. lbMessage.Text = string.Format("The file {0} had been transfered sucessfully.",  
  10. m_doc.FileName);  

#T#在调用BeginTransferDocument()方法之后,主线程不会被阻塞,仍然可以继续执行其它工作。而当服务方法执行完毕之后,会自动调用WCF回调方法,执行方法中的内容。上述实现存在一个问题,就是对于lbMessage控件的操作。由于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);  
责任编辑:田树 来源: 博客
相关推荐

2009-12-22 19:00:08

WCF回调

2009-11-09 10:59:57

WCF回调

2009-08-21 17:02:20

ASP.NET异步回调

2015-10-26 09:25:42

2009-12-08 15:52:10

WCF回调

2010-03-02 10:54:42

WCF回调操作

2010-03-01 15:12:53

WCF回调契约

2009-11-06 16:13:45

WCF回调

2009-11-09 10:50:30

WCF异步调用

2010-03-01 10:26:40

WCF异步服务

2009-11-06 15:54:15

WCF异步调用

2018-11-29 08:00:20

JavaScript异步Promise

2010-02-23 14:03:53

WCF契约回调

2010-02-24 09:59:19

WCF服务异步代理

2009-12-07 14:26:47

WCF异步调用

2010-03-01 14:01:50

WCF服务异步调用

2009-11-06 16:05:37

WCF回调契约

2010-01-06 16:40:11

.Net Framew

2010-02-25 09:13:34

WCF异步调用

2011-05-20 17:19:25

回调函数
点赞
收藏

51CTO技术栈公众号