您好,登录后才能下订单哦!
今天就跟大家聊聊有关WCF中怎么通过Dispose有效实现重用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
微软推荐的***实践是抛弃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有效实现重用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。