【问题标题】:Why is it important to dispose/close a WCF client proxy为什么处置/关闭 WCF 客户端代理很重要
【发布时间】:2011-08-25 02:34:53
【问题描述】:

我听说必须处置(或关闭)WCF 客户端代理,即使是在

  • 您没有使用会话
  • 没有需要确定性清理的非托管资源(例如打开的套接字)

例如,当使用带有默认绑定配置的 BasicHttpBinding 时,即使在流行的网页中也应该没问题,对吧?

var clt = new MyServiceClient();
clt.PlaceOrder(foo);
// no dispose

var clt = new ChannelFactory<IOrderService>().CreateChannel();
clt.PlaceOrder(foo);

谢谢

【问题讨论】:

  • 我想你可以让 GC 为你做这件事,但这不是干净的代码。你宣布它,你释放它。似乎不再教授的基础知识。

标签: c# .net wcf web-services


【解决方案1】:

用完后关闭(并处理掉它们)是一种很好的做法。 (即使您正在通过读取/写入文件流,您是否会让文件流保持打开状态?)顺便说一下,我可以看到一些原因:

  1. 服务器(可以/将)维护的活动连接数量有限。您越早处理您的服务,下一个客户就越早可以使用该插槽。 (如果您确实通过了,为什么还要等待超时?)
  2. 避免非活动连接的额外开销。如今,授予的资源“充足”,但您保留的开销越少,最终的性能就会越好。
  3. 您可以通过在超时后处理客户端来降低由于超时而导致错误/异常的风险。
  4. 通过在完成时关闭它,您可以有效地保持服务器日志的清洁。最后,即使客户端没有显示它,服务器也可能会在日志中显示超时异常,这是由于本应处理的休眠连接没有得到处理。
  5. MSDN says to(注意 WCF 客户端对象列表中的第 4 个项目符号)。

只是我能想到的几个原因。

【讨论】:

  • 关闭连接与Disposing连接不同。
  • @Kirk:同意,但还要检查以确保不存在错误,否则应执行中止。
  • 一些注意事项 - 文件系统代表非托管资源。问题中的代理人没有。问题确实是“为什么”,因为它很整洁,或者因为 MSDN 这么说,这不是我想要的。您是说 Dispose 关闭了一个打开的连接(即使对于 basicHttpBinding),这就是您应该这样做的原因吗?谢谢
  • @ConfusedNoob:文件处理是一个类比,而不是比较。我最后提到了 MSDN,因为尽管它被声明,这不是一个“好的理由”(但是包的作者提供的实现总是很好地表明你应该如何进行)。
  • @KirkBroadhurst:在 .NET 标准库中,即使存在 Close() 方法,它通常只是 Dispose() 的别名,反之亦然。这也适用于 WCF 客户端派生自 ClientBase&lt;TChannel&gt;,文档甚至声明处理客户端会关闭它。如果您想正确处理IDisposable 对象,您可以始终使用Dispose 方法而完全忘记Close,因为它是多余的。
【解决方案2】:

创建 ChannelFactory 并打开它是一项昂贵的操作,如果您关心性能,您应该避免每次调用都这样做。

即使使用 basicHttpBinding,您的第一个用例也不正确,因为它可能会为每个实例创建一个新的通道工厂。 .NET 3.5 SP1 引入了一些 ChannelFactory 缓存,因此您在某些情况下可能没问题。

在您的第二个用例中,如果您缓存并重用 channelfactory,处置并不是真正需要的,但请记住,您/您的部署人员可以更改绑定@部署时间,并且缺乏关闭/处置可能会产生巨大的影响。

总之,关闭/处置总是安全的,这就是 MSDN 建议这样做的原因。

【讨论】:

    【解决方案3】:

    这真的取决于客户的类型。例如,如果您编写一个调用服务的 ASP.NET 应用程序,那么缓存代理是个好主意,因为它的创建成本很高。

    话虽如此,一旦你完成了任何 IDisposable 资源,你应该释放它,以便被释放的对象有机会释放它所持有的资源,以便可以从内存中删除它。如果 IDisposable 对象具有 Close 方法,则应首先调用它。

    关于这个引人入胜的主题的优秀文章可以在这里找到:http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2023-01-09
      相关资源
      最近更新 更多