【问题标题】:Implement IDisposable in Class with a Web Service Proxy使用 Web 服务代理在类中实现 IDisposable
【发布时间】:2013-11-06 22:58:44
【问题描述】:

.NET 中一直让我感到困惑的一个领域就是何时实现 IDisposable 模式。

我使用 WSDL 创建了一个 SOAP Web 服务代理,它在 Component 基类上实现了 IDisposable:

public partial class WSDLGeneratedProxy : System.Web.Services.Protocols.SoapHttpClientProtocol

我创建了一种带有简化方法的外观接口,以便我可以隐藏服务代理交互,并使其实现 IDisposable:

public interface IServiceClient : IDisposable

我有一个 IServiceClient 的实现,并且该实现包含 WSDLGeneratedProxy 的一个实际成员

public class FacadeServiceClient : IServiceClient
{
    private WSDLGeneratedProxy clientProxy;
}

所以我的问题是 - 我应该显式调用服务代理上的 Dispose 方法吗?这是正确的方法吗?

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (disposing)
    {
        if (clientProxy != null)
        {
            clientProxy.Dispose();
        }
    }
}

非常感谢任何建议或意见。

【问题讨论】:

  • 处置静态生命周期对象是一件非常罕见的事情——您的意思是让clientProxy 成为静态对象吗?
  • Doh,不,我只是在复制/粘贴我面前的一些代码。不 - 它不应该是静态的。

标签: c# .net web-services idisposable


【解决方案1】:

我看不出有什么理由必须处置该对象,无论如何,当不再使用它时,它都会被垃圾回收。

IDisposable 接口的基本用途是处置非托管对象(检查Proper use of the IDisposable interface

这就是我们将usingFileStream 等System.IO 类一起使用的原因

      using (var fs = new FileStream(filePath, mode)) 
       {
              //use fs 
       }

当编译器遇到using 关键字时,它会将代码重写为类似

        FileStream fs = new FileStream(filePath, mode); 
        try 
        {
            //use fs
         }
        finally 
        {
            //compiler will automatically call dispose on the FileStream to free up unmanaged objects
             fs.Dispose(); 
         }

当您处理内存中的大对象(例如数百 MB)并且不希望等待 GC 收集它们而是更早地收集它们时,您可能还想使用 dispose。

如果您不属于上述任何一种情况,那么 GC 在处理对象方面肯定会比您做的更好。

【讨论】:

  • 是的,我知道你来自哪里。我最初提出问题的原因是由于信息冲突,例如此处概述(规则#2):blog.stephencleary.com/2009/08/… 其中指出,如果您有一个具有单个托管资源(实现 IDisposable)的类,则包含类应该在转实现 IDisposable。
  • -1 如果您的类在对象的生命周期内持有IDisposable 对象,您应该始终自己实现IDisposable 并在其处置方法中处置该对象。在某个地方,something 拥有非托管资源,需要对其进行说明。 stackoverflow.com/a/538238/3312
  • @JesseC.Slicer 我不明白为什么 -1 我认为我评论的内容非常清楚:“IDisposable 接口基础用途是处置非托管对象” => 所以很明显你有可能涉及 IDisposable 对象非托管资源,您需要处理它。另外,我发布了一个指向更复杂的答案的链接(与您所做的链接相同:|)。
  • @DanDinu “我看不出有任何理由让你不得不处置该对象”似乎与你在此评论中所说的相矛盾。
猜你喜欢
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
相关资源
最近更新 更多