2

我有一个 WCF 应用程序。

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

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

或者

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

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

4

2 回答 2

1

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

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

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

finally
{
    proxy.Abort();
}

这将安全地关闭代理。

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

于 2013-10-08T08:33:31.003 回答
0

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

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

于 2013-10-08T00:04:20.507 回答