zoukankan      html  css  js  c++  java
  • 关于WCF客户端对象的释放:Close( ) & Abort( )

    其实六七年前WCF盛行的时候也讨论过这个问题。

    Close( ) 使 ClientBase<TChannel> 对象从其当前状态转换到关闭状态。

    Abort( ) 使 ClientBase<TChannel> 对象立即从其当前状态转换到关闭状态。

    文档描述仅仅能看出“立即”两个字的差别,但究竟该怎么用就有点迷茫了。

    通过反编译可以发现,两个方法源自接口 ICommunicationObject,该接口“为系统中所有面向通信的对象(包括通道、通道管理器、工厂、侦听器以及调度程序和服务主机)定义基本状态机的协定。”

    观察源码可知 Abort( ) 方法不会抛出异常, 而 Close( )方法则可能抛出 TimeoutExceptionCommunicationException

    另外,ClientBase<TChannel> 实现了接口 IDisposable接口,这意味着我们可以在代码中使用 using 语句块,这样在出作用域时会自动调用 Dispose( ) 方法来释放资源。不过Dispose( )方法内部也仅仅是调用了 Close( )方法,因此也是存在抛异常的可能。

    究竟该怎么用??

    这里直接给出最佳实践,感兴趣的同学可以反编译查看源码。

     1 try
     2 {
     3     ...
     4     client.Close();
     5 }
     6 catch (CommunicationException e)
     7 {
     8     ...
     9     client.Abort();
    10 }
    11 catch (TimeoutException e)
    12 {
    13     ...
    14     client.Abort();
    15 }
    16 catch (Exception e)
    17 {
    18     ...
    19     client.Abort();
    20     throw;
    21 }

    引用:MSDN

  • 相关阅读:
    迭代模式
    HackSeven Canvas上的动画
    模板模式
    适配器模式
    豆瓣推荐纪录片
    二手手机十分管用的检查方法
    传参的四种方法
    守夜人誓言+考研誓言
    网络小说分享
    阿里巴巴Java开发手册(详尽版) pdf
  • 原文地址:https://www.cnblogs.com/WinHEC/p/WCF_Client_Dispose_Practice.html
Copyright © 2011-2022 走看看