日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WCF死鎖三種不同方式介紹

用過WCF的朋友們應(yīng)該會清楚的認(rèn)識到,當(dāng)我們在使用回調(diào)契約時,通常會出現(xiàn)死鎖的情況出現(xiàn)。那么如何才能正確的解決WCF死鎖問題呢?我們今天就為大家詳細(xì)介紹了幾種解決方案,供大家參考學(xué)習(xí)。#t#

創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團隊,在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕10余年,專業(yè)且經(jīng)驗豐富。10余年網(wǎng)站優(yōu)化營銷經(jīng)驗,我們已為上千多家中小企業(yè)提供了成都網(wǎng)站制作、網(wǎng)站建設(shè)解決方案,按需網(wǎng)站建設(shè),設(shè)計滿意,售后服務(wù)無憂。所有客戶皆提供一年免費網(wǎng)站維護!

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

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

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

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

第三種方案則是將回調(diào)操作設(shè)置為單向操作。此時,回調(diào)調(diào)用不會產(chǎn)生應(yīng)答消息,服務(wù)操作一旦執(zhí)行了回調(diào)操作,就會繼續(xù)執(zhí)行,回調(diào)對象不會爭用與服務(wù)實例關(guān)聯(lián)的鎖,從而解決了WCF死鎖問題。

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

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

 
 
 
  1. static List m_Callbacks = 
    new List( );   
  2. public void Connect( ) {   
  3. IMyContractCallback callback = OperationContext.Current. 
    GetCallbackChannel( );   
  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( );   
  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. }  

以上就是我們?yōu)榇蠹医榻B的幾種不同的WCF死鎖解決方法。


本文題目:WCF死鎖三種不同方式介紹
網(wǎng)站URL:http://www.5511xx.com/article/cohscge.html