我有一个异步调用包含循环的方法的类。此循环将一直运行,直到该类被释放。当暗示Dispose()时,我已经能够告诉循环停止(因此异步线程完成)。在这个调用停止Dispose()中的循环后,我应该等待循环完成并且线程死掉还是无关紧要?鉴于我已经告知循环完成,我应该继续退出Dispose()调用吗?这里的最佳做法是什么?一旦发出信号,我的循环可能需要几分钟才能完成。
答案 0 :(得分:2)
有些对象有责任确保清除外部的实体。这些对象可能是唯一具有执行此类清理所必需的信息和动力的对象;如果他们不这样做,那就不会发生。存在IDisposable以允许此类对象履行其职责。
尽管名称不同,但IDisposable并不存在以销毁对象的目的。相反,存在允许对象按顺序放置它们的事务,以便它们可以安全地被放弃(并最终被垃圾收集器销毁)。对象的Dispose方法通过将其交给其他实体来履行其职责是完全正确的,前提是可以信任其他实体来实现它们。这听起来基本上就像你正在做的那样。
在像你这样的情况下可能很棘手的唯一方面是决定Dispose是否应该简单地设置运动,以便事情应该被清理干净,或者是否应该坚持到实际情况为止。有充分理由支持这两种方法。如果调用代码需要在可以继续之前进行清理,那么使用同步Dispose方法很有用,如果清理过程中出现问题,也可能有用。让Dispose抛出一个异常是丑陋的(特别是因为没有干净的模式,Dispose可以避免在发生这种情况时丢失任何挂起的异常)但是在执行上下文仍然存在时捕获异常比在事后查找更好在执行某些未知操作时,某些未知时间发生了某些错误。不幸的是,使用同步配置可能会减慢清理速度,有时可能会导致死锁。使用异步配置可以提高响应速度,但是如果设备在Dispose返回后一段时间内无法使用,那么期望Dispose会使文件或I / O设备可用的代码可能会感到惊讶。在某些情况下,有一个" Open"方法检查资源上的dispose是否正在进行中,如果是,则等待它完成。
答案 1 :(得分:0)
如果循环可能使用最终为Dispose
d的托管资源,那么您必须等待循环完成,然后整理您的{{1} },然后退出Dispose
方法。
答案 2 :(得分:0)
这是一个只有你能回答的问题;如果消费代码需要假设在调用Dipose
之后循环将停止,那么等待。如果没有,那就不要了。