今天就跟大家聊聊有关WCF中怎么通过Dispose有效实现重用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
我们提供的服务有:成都网站建设、网站设计、微信公众号开发、网站优化、网站认证、德城ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的德城网站制作公司
微软推荐的***实践是抛弃using语句,转而利用 try/catch(/finally)语句。它要求在try语句中调用Close()方法,而在catch中调用Abort()方法。在新闻中已经说明了Close()与Abort()方法的区别,即后者可以强制地关闭客户端,包括关闭客户端连接,释放资源。由于Close()方法可能会抛出 CommunicationException和TimeoutException异常,通常的客户端代码应该是这样:
|
在***增加对Exception异常的捕获很有必要,因为我们不知道Close()方法会否抛出某些不可预知的异常,例如 OutOfMemoryException等。新闻中提到Steve Smith的方法其实就是对这段冗长代码的封装,封装方式是采用扩展方法,扩展的类型为ICommunicationObject。这是因为所有的客户端对象都实现了ICommunicationObject接口。
以下是Steve Smith的扩展方法代码:
|
利用该扩展方法,在本应调用Close()方法的地方,代替为CloseConnection()方法,就可以避免写冗长的catch代码。而使用 Lambda表达式的方式可以说是独辟蹊径,使用起来与using语法大致接近。实现方法是定义一个静态方法,并接受一个 ICommunicationObject对象与Action委托:
public class Util { public static void Using(T client, Action action) where T : ICommunicationObject { try { action(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:IDisposable { private ChannelFactory m_innerFactory; public MyChannelFactory(ChannelFactory factory) { m_innerFactory = factory; } ~MyChannelFactory() { Dispose(false); } public void Close() { Close(TimeSpan.FromSeconds(10)); } public void Close(TimeSpan span) { if (m_innerFactory != null) { if (m_innerFactory.State != CommunicationState.Opened) { return; } try { m_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); } }
看完上述内容,你们对WCF中怎么通过Dispose有效实现重用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。