【问题标题】:Will calling close() on my WCF service release all resources?在我的 WCF 服务上调用 close() 会释放所有资源吗?
【发布时间】:2009-02-13 20:36:57
【问题描述】:

在我的 WCF 服务上调用 close 会杀死所有资源还是为 GC 设置它们,还是我也应该将其设置为 null?

【问题讨论】:

    标签: c# wcf garbage-collection


    【解决方案1】:

    首先,WCF 代理是IDisposable,所以您可以在某种程度上使用using

    using(var proxy = new MyProxy()) { // see below - not quite enough
       // use proxy
    }
    

    不幸的是,WCF 还有一个错误的Dispose() 实现,它会定期抛出异常。但是,here's a really cool trick 让它正常工作。我也在博客上写过这个myself,但我认为第一个链接要好得多。

    所以:使用IDisposableusing,但要谨慎使用(在这种情况下)。

    设置字段通常没有区别。有一些边缘情况(例如由多个委托捕获的变量、静态字段、长寿命对象等),但通常不要管它。特别是,不要这样做,因为理论上这可以延长寿命:

    if(field != null) field = null; // BAD
    

    【讨论】:

    • 听起来 OP 是在谈论服务,而不是客户端,所以我不知道其中有多少是直接相关的(但了解有关 Close/ 的 WCF 设计选择很有用处理/中止)。
    【解决方案2】:

    【讨论】:

    • 实际上,由于有错误的 Dispose() 实现,使用 WCF 您确实需要做更多事情。
    【解决方案3】:

    如果之后很长一段时间都可以访问,您只需将变量设置为 null。比如说,一个长寿命对象上的一个字段,或者一个静态字段。一般情况下,这不仅适用于 WCF。

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多