4

我有一个类 A 为其他类 B、C 等提供位图。

现在,A 类将其位图保存在一个环形队列中,因此一段时间后它将失去对位图的引用。

虽然它仍在队列中,但同一个 Bitmap 可以被多个类签出,例如,B 和 C 都可以持有对同一个 Bitmap 的引用。但也有可能只有其中一个人检查了位图,甚至没有人检查过。

我想在 A、B 或 C 不再需要位图时处理它。

我想我必须让 B 和 C 负责在他们完成使用它时以某种方式发出信号,但我不确定整体逻辑。

是否应该调用 DisposeIfNowOrphan() 之类的东西,在这个例子中,它会被调用 3 次:

1 - 当位图在 A 类中被踢出队列时

2 - 当 B 完成它时

3 - 当 C 完成时

如果这是最好的策略,我该如何评估孤儿状态?

任何建议都将受到欢迎。

4

4 回答 4

3

让 A 类直接提供包装类而不是位图。包装类应该自己实现 IDisposable 并且可以用来维护一个计数器。每个消费者都可以获得他们自己的引用相同位图的包装器。A 类保留所有位图和所有包装器的陷阱。在 A 类中使用 Wea​​kReference 来跟踪包装器,因此如果消费者不调用 dispose,它将被 GC 处理,并且提供者可以知道它不再被引用。

于 2010-03-26T05:38:30.733 回答
2

Bitmap继承自Image,它实现IDisposable了 ,所以当你使用完一个实例后,你应该调用Dispose()它。这将清理Image.

但是,Image它也实现了一个终结器,因此如果由于某种原因您无法调用Dispose(),则资源将在实例的终结期间被回收,这将在不再引用该实例后的某个时间点发生。

于 2010-03-26T05:45:11.733 回答
1

如果内存使用不是一个大问题,并且正确性和清晰度更重要......

给每个接收者他们自己的位图副本,并在使用它的代码周围有一个 using() 语句。

你的管理码现在很简单,你的消费码也很简单。也很容易看到(证明?)即使您的消费者可能有异常和其他代码路径使得很难(或不可能)确保引用计数器减少(或类似),整个事情也会起作用。

使用您为共享位图开发自己的 GC 解决方案节省的时间,拿钱为您的服务器购买另一块 RAM。

于 2010-03-26T05:46:01.773 回答
0

另一方面,如果峰值内存消耗是关键问题......但您仍然需要一种“安全”的方法,您可以确保位图生命周期得到正确管理,无论消费者代码如何,您都可以反转问题并说生产者全权负责在自己的线程(或线程)中对图像的所有操作。因此,与其将图像分发给其他类来处理,不如让其他类交出动作来对图像执行。您维护一个待处理操作的队列,并且可以在队列中向前看,以根据未来没有工作要做来决定从缓冲区中丢弃哪些图像。

由于这些图像可能位于大对象堆上,因此适当地管理它们的生命周期以最大程度地减少大对象堆的碎片非常重要。

于 2010-03-26T16:16:18.137 回答