当它成为孤儿时如何处理一个对象(比如一个位图)?
我有一个A类,为其他类B,C等提供位图。
现在,A类将其位图保存在一个环形队列中,所以一段时间后它将失去对位图的引用。
虽然它仍然在队列中,但是可以通过几个类检查相同的Bitmap,这样B和C都可以保存对同一个Bitmap的引用。 但也可能只有其中一个检出Bitmap,甚至没有检查过Bitmap。
当A,B或C不再需要位图时,我想处理它。
我想我必须让B和C负责在他们使用它时以某种方式发出信号,但我不确定整体逻辑。
它应该调用DisposeIfNowOrphan()之类的东西,在这个例子中,它会被调用三次:
1 – 当位图在A类中被踢出队列时
2 – B完成时
3 – 当C完成它时
如果这是最好的策略,我该如何评估孤儿状态?
任何建议都是最受欢迎的。
让A类直接提供包装类而不是位图。 包装类应该实现IDisposable本身,并可用于维护计数器。 每个消费者都可以获得引用相同位图的自己的包装器。 A类保留所有位图和所有包装器的陷阱。 在A类中使用WeakReference来跟踪包装器,因此如果消费者不调用dispose,它将获得GC,并且提供者可以知道它不再被引用。
Bitmap
inheritance自Image
,它实现了IDisposable
,所以当你完成使用实例时,你应该在它上面调用Dispose()
。 这将清除Image
的非托管资源。
但是, Image
还实现了终结器,因此如果由于某种原因您无法调用Dispose()
,则在实例的最终确定期间将回收资源,这将在实例不再被引用后的某个时刻发生。
如果内存使用不是一个大问题,正确性和清晰度更重要……
为每个收件人提供他们自己的位图副本,并在使用它的代码周围有一个using()语句。
您的管理代码现在非常简单,您的消费代码也非常简单。 它也很容易看到(certificate?)即使您的消费者可能有exception和其他代码路径使得很难(或不可能)确保引用计数器递减(或类似),整个事情也会起作用。
使用您为共享位图开发自己的GC解决方案的时间,花钱并为您的服务器购买另一块RAM。
另一方面,如果峰值内存消耗是关键问题……但您仍然需要一种“安全”的方法,您可以确保无论消费者代码如何都可以正确管理位图生命周期,您可以将问题和假设生产者全权负责其自己的线程(或线程)中图像的所有操作。 因此,不要将图像分发给其他类来处理,而是要求其他类提交动作以执行图像。 您维护一个待处理操作的队列,并且可以在队列中向前看,以决定从缓冲区中丢弃哪些图像,这是基于将来没有工作要做的。
由于这些图像可能位于大对象堆上,因此必须适当地管理它们的生命周期以最大限度地减少大对象堆的碎片。