您不应在一个对象上多次调用 Dispose(CA2202)[重复]

Posted

技术标签:

【中文标题】您不应在一个对象上多次调用 Dispose(CA2202)[重复]【英文标题】:You should not call Dispose more than one time on an object (CA2202) [duplicate] 【发布时间】:2020-08-25 17:12:50 【问题描述】:

我已经看到有关此问题的帖子,但我似乎无法通过遵循此处的示例和其他在线位置来摆脱警告。你看到我缺少什么以避免得到CA2202 Warning 说:

为避免生成 System.ObjectDisposedException,您不应在一个对象上多次调用 Dispose。

我认为使用会处理xmlReader。是否也在处理stringReader

StringReader stringReader = null;
try

    stringReader = new StringReader(mOutputXmlString);
    using (XmlReader xmlReader = XmlReader.Create(stringReader, lXmlReaderSettings))
    
        addResponse = (AddResponseStructure)mDeserializer.Deserialize(xmlReader);
        alertDetail = new AlertHostDetail(addResponse);
    

catch

    _loggingManager.Log(LoggingHelpers.LoggingLevel.Error, "Error deserializing object.");

finally

    if (stringReader != null)
        stringReader.Dispose();

警告位于stringReader.Dispose() 行。

【问题讨论】:

当您退出 using 语句时,阅读器会自动释放。 请看***.com/a/75483/2641352 对@jdweng 的评论发表评论-xmlReaderstringReader 都将在正常退出using 语句块时或通过抛出的异常处理。 @Rich IDisposables 被IDisposable 消费的地方,在.Net 中很常见的是,消费的IDisposable 在消费时也会被处理。 @phuzi 需要明确的是,双重处置只是因为XmlReader 处置了StringReader。此处显示的代码不会双重处理。 【参考方案1】:

此代码分析警告完全是胡扯。 contract for IDisposable 要求接受对 Dispose 的额外调用并且不执行任何操作(特别是,它们不应抛出 ObjectDisposedException 或任何其他异常)。

如果多次调用对象的Dispose 方法,则对象必须忽略第一次调用之后的所有调用。 如果对象的Dispose 方法被多次调用,则该对象不得抛出异常。 当资源已被释放时,Dispose 以外的实例方法可以抛出ObjectDisposedException

来源:IDisposable.Dispose documentation on MSDN

不幸的是,一些框架代码是在没有阅读合约的情况下编写的,并且禁止多次调用 Dispose。那些你应该小心不要重复处理的物品。但通用合约仍然是对于任意IDisposable,允许多次调用Dispose

【讨论】:

以上是关于您不应在一个对象上多次调用 Dispose(CA2202)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Enzyme 测试 React 组件时出错:'不变违规:您不应在 <Router> 外使用 <Link>'

withRouter 参数解析 Invariant Violation 时出错:您不应在 <Router> 之外使用 <Route> 或 withRouter()

有一个不应硬编码但应在规则调用时作为参数传递的参数[重复]

是否存在不应在常规 try 块上使用 try-with-resources 的情况?

当传递到另一个对象时,谁应该在 IDisposable 对象上调用 Dispose?

不在 TPL Task 对象上调用 Dispose() 是不是可以接受?