知识大全 WCF中通过Dispose有效实现重用

Posted

篇首语:愿你在孤独难熬的时光里,始终没有辜负那个拼命的自己。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 WCF中通过Dispose有效实现重用相关的知识,希望对你有一定的参考价值。

WCF中通过Dispose有效实现重用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  本文将详细介绍释放客户端资源(其中包括端口 通道)和关闭连接的问题 毫无疑问 在 NET Framework中 一个资源(尤其是非托管资源)通常都需要实现IDisposable接口 一旦实现了该接口 我们就可以使用using语句来管理资源 这是最便捷的方式 但是 一旦在using语句中抛出了异常 就可能不会正确完成资源的回收 尤其是连接 很可能会一直打开 既占用了通道和端口 还可能出现资源的浪费 从而影响系统的性能和稳定性

  微软推荐的最佳实践是抛弃using语句 转而利用 try/catch(/finally)语句 它要求在try语句中调用Close()方法 而在catch中调用Abort()方法 在新闻中已经说明了Close()与Abort()方法的区别 即后者可以强制地关闭客户端 包括关闭客户端连接 释放资源 由于Close()方法可能会抛出 CommunicationException和TimeoutException异常 通常的客户端代码应该是这样

  var myClient = new MyClient();try//其他代码myClient Close();catch (CommunicationException)myClient Abort();catch (TimeoutException)myClient Abort();catch (Exception)myClient Abort();throw;

  在最后增加对Exception异常的捕获很有必要 因为我们不知道Close()方法会否抛出某些不可预知的异常 例如 OutOfMemoryException等 新闻中提到Steve Smith的方法其实就是对这段冗长代码的封装 封装方式是采用扩展方法 扩展的类型为ICommunicationObject 这是因为所有的客户端对象都实现了ICommunicationObject接口

  以下是Steve Smith的扩展方法代码

  public static class Extensionspublic static void CloseConnection(this ICommunicationObject myServiceClient)if (myServiceClient State != CommunicationState Opened)return; trymyServiceClient Close();catch (CommunicationException ex)Debug Print(ex ToString());myServiceClient Abort();catch (TimeoutException ex)Debug Print(ex ToString());myServiceClient Abort();catch (Exception ex)Debug Print(ex ToString());myServiceClient Abort();throw;

  利用该扩展方法 在本应调用Close()方法的地方 代替为CloseConnection()方法 就可以避免写冗长的catch代码 而使用 Lambda表达式的方式可以说是独辟蹊径 使用起来与using语法大致接近 实现方法是定义一个静态方法 并接受一个 ICommunicationObject对象与Action委托 public class Utilpublic static void Using(T client Action action)where T : ICommunicationObjecttryaction(client);client Close();catch (CommunicationException)client Abort();catch (TimeoutException)client Abort();catch (Exception)client Abort();throw;

  使用时 可以将原本的客户端代码作为Action委托的Lambda表达式传递给Using方法中 Util Using(new MyClient() client =>client SomeWCFOperation();//其他代码;);

  还有一种方法是定义一个自己的ChannelFactory 让其实现IDisposable接口 并作为ChannelFactory的Wrapper 类 在该类中定义Close()和Dispose()方法时 考虑到异常抛出的情况 并在异常抛出时调用Abort()方法 这样我们就可以在using 中使用自定义的ChannelFactory类 例如

  public class MyChannelFactory:IDisposableprivate ChannelFactory m_innerFactory;public MyChannelFactory(ChannelFactory factory)m_innerFactory = factory;~MyChannelFactory()Dispose(false);public void Close()Close(TimeSpan FromSeconds( ));public void Close(TimeSpan span)if (m_innerFactory != null)if (m_innerFactory State != CommunicationState Opened)return;trym_innerFactory Close(span);catch (CommunicationException)m_innerFactory Abort();catch (TimeOutException)m_innerFactory Abort();catch (Exception)m_innerFactory Abort();throw;private void Dispose(booling disposing)if (disposing)Close();void IDisposable Dispose()Dispose(true);GC SuppressFinalize(this);

cha138/Article/program/net/201311/13580

相关参考

知识大全 ASP 中通过OLEDB访问Oracle的代码

ASP中通过OLEDB访问Oracle的代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  系统

知识大全 ASP 中通过OLEDB访问 Oracle 的代码

ASP中通过OLEDB访问Oracle的代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  系统

知识大全 如何在squid中通过URL进行访问控制

如何在squid中通过URL进行访问控制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在squ

知识大全 c#中通过设置钩子监视鼠标移动

这个问题来自论坛提问咨询如何通过设置钩子监视鼠标的移动C#的大致代码如下      usingSystem;usingSystemWindowsForms;usingSystemRuntimeInte

知识大全 C#中通过读取配置文件动态创建泛型对象

C#中通过读取配置文件动态创建泛型对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  背景  我

知识大全 ASP.NET中通过富用户界面公开服务

ASP.NET中通过富用户界面公开服务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  富用户界面

知识大全 Sql Server中通过父记录查找出所有关联的子记录

SqlServer中通过父记录查找出所有关联的子记录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 jquery中通过父级查找进行定位示例

如果想要查找到有icon这个class的span除了用原始的代码还可以用父级查询的方法进行定位具体的实现如下感兴趣的朋友可以参考下哈希望对大家有所帮助 复制代码代码如下:<ulid=“

知识大全 c#中通过值和引用传递参数

  在C#中既可以通过值也可以通过引用传递参数通过引用传递参数允许函数成员(方法属性索引器运算符和构造函数)更改参数的值并保持该更改若要通过引用传递参数请使用ref或out关键字为简单起见本主题的示例

知识大全 企业在经营过程中通过考核得到的项目经营资质可以计入无形资产吗····

企业在经营过程中通过考核得到的项目经营资质可以计入无形资产吗····?求可靠回答!一般不能。企业内部形成的一般只有符合条件的产品开发支出才可以计入无形资产资本化要是外部购买的是可以的希望对你有用信誉和