日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WCFIDisposable接口應用功能詳解

WCF是由微軟公司開發(fā)的一款功能強大的.NET Framework 3.5的重要組成部件,主要作用于通信方面,在.NET Framework中,一個資源(尤其是非托管資源)通常都需要實現(xiàn)WCF IDisposable接口。一旦實現(xiàn)了該接口,我們就可以使用using語句來管理資源,這是最便捷的方式。但是,一旦在using語句中拋出了異常,就可能不會正確完成資源的回收,尤其是連接,很可能會一直打開,既占用了通道和端口,還可能出現(xiàn)資源的浪費,從而影響系統(tǒng)的性能和穩(wěn)定性。

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

 
 
 
  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. }

***在WCF IDisposable接口增加對Exception異常的捕獲很有必要,因為我們不知道Close()方法會否拋出某些不可預知的異常,例如OutOfMemoryException等。新聞中提到Steve Smith的方法其實就是對這段冗長代碼的封裝,封裝方式是采用擴展方法,擴展的類型為ICommunicationObject。這是因為所有的客戶端對象都實現(xiàn)了ICommunicationObject接口。以下是Steve Smith的擴展方法代碼:

 
 
 
  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. }
  9. try
  10. {
  11. myServiceClient.Close();
  12. }
  13. catch (CommunicationException ex)
  14. {
  15. Debug.Print(ex.ToString());
  16. myServiceClient.Abort();
  17. }
  18. catch (TimeoutException ex)
  19. {
  20. Debug.Print(ex.ToString());
  21. myServiceClient.Abort();
  22. }
  23. catch (Exception ex)
  24. {
  25. Debug.Print(ex.ToString());
  26. myServiceClient.Abort();
  27. throw;
  28. }
  29. }
  30. }

利用該擴展方法,在本應調(diào)用Close()方法的地方,代替為CloseConnection()方法,就可以避免寫冗長的catch代碼。而使用Lambda表達式的方式可以說是獨辟蹊徑,使用起來與using語法大致接近。實現(xiàn)方法是定義一個靜態(tài)方法,并接受一個ICommunicationObject對象與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. }

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

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

還有一種方法是定義一個自己的ChannelFactory,讓其實現(xiàn)WCF IDisposable接口,并作為ChannelFactory的Wrapper類。在該類中定義Close()和Dispose()方法時,考慮到異常拋出的情況,并在異常拋出時調(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. }

對WCF IDisposable接口的相關(guān)介紹就為大家介紹到這里。


分享標題:WCFIDisposable接口應用功能詳解
網(wǎng)站URL:http://www.dlmjj.cn/article/djigoee.html