【问题标题】:How to Dispose() when class is running an async loop? Wait for loop to exit?类运行异步循环时如何处理()?等待循环退出?
【发布时间】:2011-06-02 23:00:45
【问题描述】:

我有一个异步调用包含循环的方法的类。这个循环将一直运行,直到类被释放。当实现 Dispose() 时,我已经有能力告诉循环停止(因此异步线程完成)。在调用 Dispose() 中停止循环之后,我应该等待循环完成并且线程死亡还是没关系?鉴于我已经发出完成循环的信号,我应该继续退出 Dispose() 调用吗?这里的最佳做法是什么?一旦发出信号,我的循环可能需要几分钟才能完成。

【问题讨论】:

    标签: .net .net-4.0 dispose idisposable


    【解决方案1】:

    某些对象有责任确保清理它们之外的实体。此类对象可能是任何地方唯一具有执行此类清理所需的信息和动力的事物;如果他们不这样做,就不会发生。 IDisposable 的存在是为了允许此类对象履行其职责。

    尽管有它的名字,IDisposable 并不是为了销毁对象而存在的。相反,它的存在是为了允许对象整理它们的事务,以便它们可以安全地被丢弃(并最终被垃圾收集器销毁)。一个对象的 Dispose 方法通过将它们移交给其他实体来履行其职责是完全正确的,前提是可以信任其他实体来履行这些职责。这听起来很像你正在做的事情。

    在像您这样的情况下,唯一可能棘手的方面是决定 Dispose 是否应该简单地启动事物以便清理事物,或者是否应该一直存在直到它们真正被清理。有大量的论据支持这两种方法。如果调用代码需要在进行清理之前进行清理,则使用同步 Dispose 方法很有用,如果清理过程中可能出现问题,也可能很有用。让 Dispose 抛出异常是丑陋的(特别是因为 Dispose 没有干净的模式来避免丢失任何挂起的异常,如果发生这种情况),但是在执行上下文仍然存在时捕获异常比在发生某些错误之后发现要好得多在某个未知的时间做一些未知的动作。不幸的是,使用同步 dispose 会减慢清理速度,有时可能会导致死锁。使用异步 dispose 可能会提高响应能力,但是如果在 Dispose 返回后一段时间内设备不可用,则预期 Dispose 将使文件或 I/O 设备等可用的代码可能会感到惊讶。在某些情况下,使用“打开”方法检查是否正在对资源进行处置并等待它完成可能会有所帮助。

    【讨论】:

    • +1。伟大的写作。感谢您探索这两种方法的方式。
    【解决方案2】:

    如果循环可能正在使用最终成为 Disposed 的托管资源,那么您必须等待循环完成,然后整理您的 Dispose,然后退出Dispose 方法。

    【讨论】:

    • @Will - 我的循环实际上在发出停止信号后会处理一些托管资源。 @Adams 的回应似乎是说这无关紧要,重要的是消费代码的期望?
    • @SFun28 - 如果您的 Dispose 处理循环将消耗的任何内容(包括正在处理的类的任何成员),那么就会发生不好的事情 - 除非您等待循环停止。
    • 我的处置不会处置循环将处置的任何东西(什么是一口!)。有一个干净的分离。类的 dispose 只是告诉循环停止。每当循环停止时,它就会处理大量资源。这些资源实际上包含在类的私有成员中,而不是循环本身 - 这有什么不同吗?
    • 您是否愿意在包含循环中引用的成员的类上调用 Dispose?
    • @Will - 这是不好的做法吗?循环在类中的一个方法中。像任何方法一样,它应该可以访问私有成员。碰巧该方法被称为异步,并且仅在释放类时才结束。
    【解决方案3】:

    这是一个只有你才能回答的问题;如果消费代码需要假设在调用Dipose 之后循环将停止,则等待。如果没有,那就不要。

    【讨论】:

    • 我有点困惑,一个类的代码不应该与类的消费方式无关吗?一个类应该始终“做正确的事”,而不是预期谁将实例化它。
    • @SFun28:一个类不能完全不知道它是如何被使用的;您基于“正确”编写要使用的类(换句话说,API)的想法来定义方法签名和嵌套类型。同样,您必须根据您打算如何使用该类来选择是否终止循环并等待它完成。如果您认为这两种情况都有效,您还可以选择将此行为指定为类的属性。
    猜你喜欢
    • 2017-01-31
    • 2021-04-15
    • 1970-01-01
    • 2019-04-17
    • 2017-12-12
    • 2019-07-02
    • 2021-10-18
    • 2021-07-17
    • 2013-01-01
    相关资源
    最近更新 更多