繁体   English   中英

我需要使用IDisposable吗?

[英]Do I need to use IDisposable?

尝试查看我是否正确理解了这一点。 遗憾的是,我没有使用IDisposable的丰富经验。 我们正在使用静态类,并使它成为非静态类,并且该类负责在Xamarin应用中进行Web服务调用。 我绝对不希望这是一个对象。 因此,我想到让此类继承IDisposable接口,并实现了如下所示的方法:

private bool disposedValue = false; // To detect redundant calls

protected virtual void Dispose(bool disposing)
{
    if (!disposedValue)
    {
        if (disposing)
        {
            // TODO: dispose managed state (managed objects).
        }

        // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
        // TODO: set large fields to null.

        disposedValue = true;
    }
}

// TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
//~WebServiceCallThread()
//{
//    // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
//    Dispose(false);
//}

// This code added to correctly implement the disposable pattern.
public void Dispose()
{
    // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
    Dispose(true);
    // TODO: uncomment the following line if the finalizer is overridden above.
    //GC.SuppressFinalize(this);
}

因此,所有这些似乎都在做,就是在调用Dispose方法时,它随后调用在Dispose(bool disposing)上方声明的虚拟方法。 对于当前的代码,这什么也没做(看起来如此)。 它只是调用Dispose方法,其中调用了重载的Dispose方法。 但实际上,这里没有任何东西可以“处置”。

经过一些研究,它看起来很像(这就是为什么我要问的原因,我认为我理解正确)。 它说,如果您dispose managed state ,则仅调用finalizerGC.SuppressFinalize方法。 我不确定dispose manage state含义是什么,但是在我的课上确实没有什么需要配置的。 我只是有一些全局int变量,仅此而已。 此类的核心是HttpCall,它已经自动处理对象,例如:

public async void CallUrlHttpClient(string URL, System.Action<string> Handler, System.Action<XamarinMobile.Classes.ErrorInfo> ErrorHandler, int Tries)
        {
            var result = string.Empty;
            didMakeSuccessfulHttpRequest = false;

            using (var client = new HttpClient())
            {
               ... Code
            }
            ...

所以这是我的问题:我是否需要使此类继承IDisposable 我想知道是否在做任何事情,但似乎我的应用程序可以利用GC摆脱使用此类的对象。 这就是我通过类中的静态方法调用它的方式:

    public static void WebServiceCall(string URL, System.Action<string> Callback)
    {
        //using (XamarinMobile.Classes.WebServiceCallThread thread = new Classes.WebServiceCallThread())
        //{
        XamarinMobile.Classes.WebServiceCallThread thread = new Classes.WebServiceCallThread();
        thread.Call(URL, Callback);
        //} 
    }

如果我正确理解GC,则一旦完成此方法,GC就会自动摆脱该对象。 那么,我真的需要使WebServiceCallThread继承自IDisposable吗? 我再次问我是否正确理解了所有这些。 如果没有,请纠正我,让我知道我感到困惑的地方。

谢谢。

如果您的类创建了HttpClient并在其整个生命周期中都维护了该实例(例如实例变量),则将实现IDisposable ,而Dispose()方法将处理HttpClient

那就是这一部分:

if (disposing)
{
    // TODO: dispose managed state (managed objects).
    _httpClient.Dispose();
}

在这种情况下,您不需要实现IDisposable因为您已经在处理HttpClient

        using (var client = new HttpClient())
        {
           ... Code
        }

但是, 实际上建议每个端点创建一个HttpClient实例HttpClient用它,而不是一遍又一遍地创建和处理。 (如果您的负载不是那么重,那么创建和处理HttpClient可能不会造成任何不良影响。)

如果要避免创建和处理HttpClient则可以实现IDisposable 您的类创建或接收HttpClient实例(在其构造函数中)。 现在,您的类“拥有”了在处置您的类时需要处置的那个实例,您就可以使您的类IDisposable 这样,其他人知道您的班级需要处置。 他们可能不知道为什么,但这并不重要。 通过使其成为IDisposable您可以让他们知道他们需要处理它。 然后,当您的类被处置时,它将清理其HttpClient


只是提供一些额外的说明:

许多人被问到“ IDisposable用途是什么?” 会回答这会导致垃圾收集。 实际上,它与垃圾回收无关。 无论对象是否实现IDisposable ,它们总是在超出范围时(不再有对其的引用)被垃圾回收。

之所以会出现混乱,是因为IDisposable的推荐模式(您所引用的模式)包括一个终结器( ~WebServiceCallThread() ),该终结器在对象被垃圾回收时被调用。

当垃圾收集器删除一项时,如果有一项,它将调用终结器。 如果尚未调用终结器,则此模式将使终结器调用Dispose() ,以防万一有人不按预期调用Dispose()情况下进行备份。 但这不能替代调用Dispose()因为没有告诉垃圾收集器何时收集该项目。 终结者有可能永远不会被调用。 它只是试图减轻如果消费者不调用Dispose()会发生的情况的备份。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM