教你利用WCF回调操作解决死锁问题

开发 后端
这里列举了一个关于利用WCF回调解决死锁问题的案例分析,文章有详细的代码介绍,希望对大家有帮助。

死锁这个问题是很麻烦的,我们现在就这个问题分析一下,这里提供了方案则是将WCF回调操作设置为单向操作。此时,回调调用不会产生应答消息,服务操作一旦执行了WCF回调操作,就会继续执行,回调对象不会争用与服务实例关联的锁,从而解决了死锁问题。

  1. interface IMyContractCallback   
  2. {   
  3. [OperationContract(IsOneWay = true)]   
  4. void OnCallback( );   
  5. }  

#T#使用回调对象时,需要考虑到客户端代理可能会被关闭,如果此时调用回调,就会引发一个ObjectDisposedException异常。“因此,对于客户端而言,当它不再需要接收回调或者客户端应用程序已经关闭时,***能够通知服务。”本书给出了解决这一问题的方法,就是为服务契约增加两个操作 Connect()与Disconnect()。其中,Disconnect()正是起到了通知服务的作用,它在客户端代理关闭的情况下,可以将当前的WCF回调对象引用从列表中移除。至于Connect()方法则是出于对称的目的而引入,但引入它还有一个好处是,它可以使得客户端能够多次地连接或断开。实现 Connect()与Disconnect()方法的代码如下:

  1. static List<IMyContractCallback> m_Callbacks = new List<IMyContractCallback>( );   
  2. public void Connect( )   
  3. {   
  4. IMyContractCallback callback = OperationContext.Current.   
  5. GetCallbackChannel<IMyContractCallback>( );   
  6. if(m_Callbacks.Contains(callback) == false)   
  7. {   
  8. m_Callbacks.Add(callback);   
  9. }   
  10. }   
  11. public void Disconnect( )   
  12. {   
  13. IMyContractCallback callback = OperationContext.Current.   
  14. GetCallbackChannel<IMyContractCallback>( );   
  15. if(m_Callbacks.Contains(callback) == true)   
  16. {   
  17. m_Callbacks.Remove(callback);   
  18. }   
  19. else   
  20. {   
  21. throw new InvalidOperationException("Cannot find callback");   
  22. }   
  23. }  


 

责任编辑:田树 来源: 博客
相关推荐

2010-03-02 10:54:42

WCF回调操作

2010-02-23 14:03:53

WCF契约回调

2009-12-22 19:00:08

WCF回调

2009-11-05 11:12:21

WCF自宿主

2009-11-09 15:58:07

WCF回调方法

2009-12-08 15:52:10

WCF回调

2010-03-01 15:12:53

WCF回调契约

2009-12-08 16:30:29

WCF程序

2020-04-14 10:20:12

MySQL数据库死锁

2024-10-16 11:40:47

2023-02-08 08:32:41

轮询锁

2009-11-09 10:10:13

WCF异常

2009-11-09 09:06:44

WCF端口

2009-12-07 16:23:46

WCF编程

2010-04-29 17:46:31

Oracle死锁

2021-06-08 08:38:36

MySQL数据库死锁问题

2009-11-06 16:05:37

WCF回调契约

2009-11-05 10:13:39

WCF框架

2022-03-08 11:17:54

函数指针回调函数C语言

2011-07-25 14:27:10

Objective-C 协议 函数
点赞
收藏

51CTO技术栈公众号