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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
WCFDispose正確應(yīng)用方式介紹

.NET Framework中有一個(gè)非常重要的部件,叫做WCF。它的應(yīng)用可以幫助我們輕松實(shí)現(xiàn)各種特定需求。在這里我們可以先從WCF Dispose的相關(guān)應(yīng)用方法來(lái)進(jìn)行一個(gè)深入的研究,來(lái)加深我們對(duì)此的印象。#t#

目前創(chuàng)新互聯(lián)公司已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、合浦網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

毫無(wú)疑問(wèn),在.NET Framework中,一個(gè)資源(尤其是非托管資源)通常都需要實(shí)現(xiàn)IDisposable接口。一旦實(shí)現(xiàn)了該接口,我們就可以使用using語(yǔ)句來(lái)管理資源,這是最便捷的方式。但是,一旦在using語(yǔ)句中拋出了異常,就可能不會(huì)正確完成資源的回收,尤其是連接,很可能會(huì)一直打開(kāi),既占用了通道和端口,還可能出現(xiàn)資源的浪費(fèi),從而影響系統(tǒng)的性能和穩(wěn)定性。

微軟推薦的最佳實(shí)踐是拋棄using語(yǔ)句,轉(zhuǎn)而利用 try/catch(/finally)語(yǔ)句。它要求在try語(yǔ)句中調(diào)用Close()方法,而在catch中調(diào)用Abort()方法。在新聞中已經(jīng)說(shuō)明了Close()與Abort()方法的區(qū)別,即后者可以強(qiáng)制地關(guān)閉客戶端,包括關(guān)閉客戶端連接,釋放資源。由于Close()方法可能會(huì)拋出 CommunicationException和TimeoutException異常,通常的客戶端代碼應(yīng)該是這樣:

 
 
 
  1. var myClient = new MyClient();
  2. try
  3. {
  4. //其他代碼
  5. myClient.Close();
  6. }
  7. catch (CommunicationException)
  8. {
  9. myClient.Abort();
  10. }
  11. catch (TimeoutException)
  12. {
  13. myClient.Abort();
  14. }
  15. catch (Exception)
  16. {
  17. myClient.Abort();
  18. throw;
  19. }

在最后增加對(duì)Exception異常的捕獲很有必要,因?yàn)槲覀儾恢繡lose()方法會(huì)否拋出某些不可預(yù)知的異常,例如 OutOfMemoryException等。新聞中提到Steve Smith的方法其實(shí)就是對(duì)這段冗長(zhǎng)代碼的封裝,封裝方式是采用擴(kuò)展方法,擴(kuò)展的類型為ICommunicationObject。這是因?yàn)樗械目蛻舳藢?duì)象都實(shí)現(xiàn)了ICommunicationObject接口。以下是Steve Smith的擴(kuò)展方法代碼:

 
 
 
  1. public static class Extensions
  2. {
  3. public static void CloseConnection(this 
    ICommunicationObject myServiceClient)
  4. {
  5. if (myServiceClient.State != CommunicationState.Opened)
  6. {
  7. return;
  8. try
  9. {
  10. myServiceClient.Close();
  11. }
  12. catch (CommunicationException ex)
  13. {
  14. Debug.Print(ex.ToString());
  15. myServiceClient.Abort();
  16. }
  17. catch (TimeoutException ex)
  18. {
  19. Debug.Print(ex.ToString());
  20. myServiceClient.Abort();
  21. }
  22. catch (Exception ex)
  23. {
  24. Debug.Print(ex.ToString());
  25. myServiceClient.Abort();
  26. throw;
  27. }
  28. }
  29. }

利用該擴(kuò)展方法,在本應(yīng)調(diào)用Close()方法的地方,代替為CloseConnection()方法,就可以避免寫(xiě)冗長(zhǎng)的catch代碼。而使用 Lambda表達(dá)式的方式可以說(shuō)是獨(dú)辟蹊徑,使用起來(lái)與using語(yǔ)法大致接近。實(shí)現(xiàn)方法是定義一個(gè)靜態(tài)方法,并接受一個(gè) ICommunicationObject對(duì)象與Action委托:

 
 
 
  1. public class Util
  2. {
  3. public static void Using(T client, Action action)
  4. where T : ICommunicationObject
  5. {
  6. try
  7. {
  8. action(client);
  9. client.Close();
  10. }
  11. catch (CommunicationException)
  12. {
  13. client.Abort();
  14. }
  15. catch (TimeoutException)
  16. {
  17. client.Abort();
  18. }
  19. catch (Exception)
  20. {
  21. client.Abort();
  22. throw;
  23. }
  24. }
  25. }

使用時(shí),可以將原本的客戶端代碼作為Action委托的Lambda表達(dá)式傳遞給Using方法中:

 
 
 
  1. Util.Using(new MyClient(), client =>
  2. {
  3. client.SomeWCFOperation();
  4. //其他代碼;
  5. });

還有一種方法是定義一個(gè)自己的ChannelFactory,讓其實(shí)現(xiàn)IDisposable接口,并作為ChannelFactory的Wrapper 類。在該類中定義Close()和WCF Dispose方法時(shí),考慮到異常拋出的情況,并在異常拋出時(shí)調(diào)用Abort()方法。這樣我們就可以在using 中使用自定義的ChannelFactory類。例如:

 
 
 
  1. public class MyChannelFactory:IDisposable
  2. {
  3. private ChannelFactory m_innerFactory;
  4. public MyChannelFactory(ChannelFactory factory)
  5. {
  6. m_innerFactory = factory;
  7. }
  8. ~MyChannelFactory()
  9. {
  10. Dispose(false);
  11. }
  12. public void Close()
  13. {
  14. Close(TimeSpan.FromSeconds(10));
  15. }
  16. public void Close(TimeSpan span)
  17. {
  18. if (m_innerFactory != null)
  19. {
  20. if (m_innerFactory.State != CommunicationState.Opened)
  21. {
  22. return;
  23. }
  24. try
  25. {
  26. m_innerFactory.Close(span);
  27. }
  28. catch (CommunicationException)
  29. {
  30. m_innerFactory.Abort();
  31. }
  32. catch (TimeOutException)
  33. {
  34. m_innerFactory.Abort();
  35. }
  36. catch (Exception)
  37. {
  38. m_innerFactory.Abort();
  39. throw;
  40. }
  41. }
  42. }
  43. private void Dispose(booling disposing)
  44. {
  45. if (disposing)
  46. {
  47. Close();
  48. }
  49. }
  50. void IDisposable.Dispose()
  51. {
  52. Dispose(true);
  53. GC.SuppressFinalize(this);
  54. }
  55. }

其實(shí),新聞中提到采用代理模式的方式與此實(shí)現(xiàn)相同??傊?,萬(wàn)變不離其宗,所有替代方案的設(shè)計(jì)本質(zhì)都是對(duì)冗長(zhǎng)的try/catch/finally的一次包裝,從而有效地實(shí)現(xiàn)重用,保證系統(tǒng)的安全、性能與穩(wěn)定性。

以上就是對(duì)WCF Dispose的應(yīng)用方式的介紹。


分享題目:WCFDispose正確應(yīng)用方式介紹
分享URL:http://www.5511xx.com/article/dpodecp.html