【问题标题】:Can I encapsulate wcf proxy close() in a destructor?我可以将 wcf 代理 close() 封装在析构函数中吗?
【发布时间】:2013-10-07 23:57:41
【问题描述】:

我有一个 WCF 应用程序。

我了解最佳做法是将这些客户端代理对象与 using 语句或 try/finally 块一起使用,如下所示:

using(var proxy = MyChannelFactory.CreateChannel())
{
    //do stuff here
}

var proxy = MyChannelFactory.CreateChannel();
try
{
    //do stuff here
}finally{
    proxy.close();
}

我想知道的是...... 如果我将关闭通道的代码放在析构函数中,是否可以在代理对象超出范围时依靠垃圾收集器调用析构函数代码,从而确保代理全部正确关闭?

【问题讨论】:

    标签: c# wcf proxy


    【解决方案1】:

    在 finally 块中调用代理上的 Close() 不是一个好主意。

    代理最终派生自ICommunicationObject,调用Close() 可能会引发更多异常。

    与其调用 Close(),不如调用Abort():

    finally
    {
        proxy.Abort();
    }
    

    这将安全地关闭代理。

    此外,我认为没有任何理由强制 GC 收集您的代理 - GC 已经过优化,可以以最有效的方式工作,所以不要干涉它。

    【讨论】:

      【解决方案2】:

      最好不要依赖垃圾收集器来完成这项工作。您不知道垃圾收集何时会发生,而且它可能不会发生的时间比您预期的要长。届时,您将继续使用您的开放代理。

      using 和 try/finally 很容易使用,并遵循在完成使用资源后应立即关闭资源的规则。

      【讨论】:

      • 不同意,规则是​​您应该在使用完非托管资源后立即处理它们。
      猜你喜欢
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2011-03-05
      • 2010-09-27
      • 2010-09-06
      • 1970-01-01
      • 2014-04-15
      相关资源
      最近更新 更多