成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WCF死鎖三種不同方式介紹

開發 開發工具
我們今天在這篇文中為大家總結了三種比較常用的解決WCF死鎖問題的相關方法,希望能夠幫助朋友們在實際開發中解決問題。

用過WCF的朋友們應該會清楚的認識到,當我們在使用回調契約時,通常會出現死鎖的情況出現。那么如何才能正確的解決WCF死鎖問題呢?我們今天就為大家詳細介紹了幾種解決方案,供大家參考學習。#t#

例如,當客戶端執行服務操作時,向客戶端發出的調用會阻塞服務端進程,以等待服務操作執行完畢。而在該服務操作中,又獲得了回調契約對象的引用(或者獲得保存的回調契約副本),并執行回調操作。由于服務類被配置為單線程訪問,則服務實例是與鎖相關聯的。如果回調對象也需要返回同一個鎖的所有權,簡單的說,就是指當回調的應答消息也需要獲得與服務實例關聯的相同的鎖時,就會導致死鎖。因為此時服務線程已經被阻塞,服務操作正在等待回調操作執行完畢,而回調操作卻又在等待服務釋放鎖,自然會產生鎖的爭用。

解決WCF死鎖的辦法有三個,一個是將服務配置為允許多線程訪問,但這會增加服務開發者管理多線程的負擔。第二個方案是將回調設置為重入(Reentrancy),如下所示:

 

  1. [ServiceBehavior(ConcurrencyModeConcurrencyMode = 
    ConcurrencyMode.Reentrant)]   
  2. class MyService : IMyContract   
  3. {   
  4. public void DoSomething( )   
  5. {   
  6. IMyContractCallback callback = OperationContext.Current. 
    GetCallbackChannel
    <IMyContractCallback>( );  
  7. callback.OnCallback( );   
  8. }   
  9. }   
  10.  

 

所謂“重入”,是指對同步域擁有獨占訪問權的線程A調用了同步域之外對象的方法,此時,另外的線程B若要訪問該同步域,則線程A將釋放對同步域的鎖,允許線程B進入。直到線程B執行完畢并釋放對同步域的鎖后,線程A將重新進入該同步域。配置回調為重入時,因為服務對象是與線程關聯的,屬于同步域的對象,而回調對象則屬于同步域之外的對象。由于服務被配置為重入,則服務調用回調引用時會釋放鎖。然后將回調返回給客戶端,控制權則返回給服務,服務會重入并重新獲取鎖。這樣就解決了死鎖的問題。

第三種方案則是將回調操作設置為單向操作。此時,回調調用不會產生應答消息,服務操作一旦執行了回調操作,就會繼續執行,回調對象不會爭用與服務實例關聯的鎖,從而解決了WCF死鎖問題。

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

在使用回調對象時,需要考慮到客戶端代理可能會被關閉,如果此時調用回調,就會引發一個ObjectDisposedException異常。“因此,對于客戶端而言,當它不再需要接收回調或者客戶端應用程序已經關閉時,***能夠通知服務。”本書給出了解決這一問題的方法,就是為服務契約增加兩個操作Connect()與Disconnect()。其中,Disconnect()正是起到了通知服務的作用,它在客戶端代理關閉的情況下,可以將當前的回調對象引用從列表中移除。至于Connect()方法則是出于對稱的目的而引入,但引入它還有一個好處是,它可以使得客戶端能夠多次地連接或斷開。實現Connect()與Disconnect()方法的代碼如下:

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

以上就是我們為大家介紹的幾種不同的WCF死鎖解決方法。

責任編輯:曹凱 來源: IT168
相關推薦

2010-02-04 10:33:40

C++異常傳遞

2010-02-26 13:34:50

WCF編碼機制

2010-02-23 14:24:50

WCF狀態保存

2010-02-23 09:58:21

WCF客戶端驗證

2009-11-06 10:54:19

WCF服務方式

2018-12-01 09:15:47

物聯網設備物聯網IOT

2009-08-20 17:30:02

C#連接字符串

2009-11-06 13:23:27

WCF模式

2019-12-09 10:30:42

Windows 10帳戶Windows

2009-12-21 13:37:43

WCF消息交換

2011-07-22 17:22:20

Spring

2012-07-17 09:16:16

SpringSSH

2024-07-08 09:03:31

2009-12-22 15:14:33

WCF調用

2010-02-22 14:18:34

WCF服務驗證

2010-04-20 12:00:01

負載均衡技術

2009-12-22 13:34:07

WCF性能計數器級別

2020-11-01 17:10:46

異步事件開發前端

2011-04-08 11:13:50

CISCO IOS令牌桶雙桶

2010-06-13 16:04:14

MySQL三種安裝方式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品一区二区三区在线 | 91看片在线| 视频在线亚洲 | 国产欧美视频一区二区三区 | 国产精品免费小视频 | 欧美性网 | www.蜜桃av.com | 欧美vide | 色久五月 | 天天亚洲 | 一区二区三区在线观看视频 | 亚洲精品国产精品国自产在线 | 精品视频在线观看 | 国产精品.xx视频.xxtv | 欧美日韩亚洲二区 | 毛片网在线观看 | 成人在线视频网 | 视频一区在线 | 国产一区二区三区视频 | 中文字幕一区二区三区在线观看 | 国产91丝袜在线18 | 黄色毛片一级 | 国产成人免费视频网站视频社区 | 国产成人免费视频网站视频社区 | 免费观看成人性生生活片 | 精品欧美一区二区在线观看 | 亚洲成人动漫在线观看 | 一级片免费在线观看 | 成人精品一区二区 | 中文字幕日韩欧美 | 亚洲成人在线免费 | 小h片免费观看久久久久 | 国产91视频一区二区 | 国产真实乱对白精彩久久小说 | www.中文字幕.com | 91免费版在线观看 | 日韩电影a| 中文字幕第九页 | 国产精品国产精品国产专区不片 | 免费电影av | 欧美日韩综合一区 |