我有一个关于弱引用的问题。
我现在正在编写一个“资源管理器”,它必须保留对创建的纹理对象的引用。我有一个字典,例如:
Dictionary<uint, WeakReference>
正如您可能已经猜到的那样,第一个参数是资源 ID,第二个参数是对资源本身的弱引用。
现在我的资源确实有一种方法可以将自己从所有者(即资源管理器)中解放出来。他们通过调用资源管理器中的方法并传递 this 引用来实现这一点。 ResMgr 会查找是否是他保留书签的资源,如果是,则执行如下操作:
WeakReference result;
if (m_Resources.TryGetValue(ResourceId, out result))
{
if (result.IsAlive)
return;
(result.Target as Resource).free(); // free for good
m_Resources.Remove(ResourceId);
}
我遇到的问题是之后的部分:
if (result.IsAlive)
永远不会到达,因为仍然存在对该资源的剩余引用。
问题是,我只有一个相关资源的引用,它会自行释放,如下所示:
resource.free(); // calls internally its owner (i.e. ResMgr)
resource = null;
我猜剩下的引用将是“资源”变量,但我不能将其设置为 null,因为我必须先调用 free。真是两难啊……
我想要实现的是一个资源管理器,它保留对其所属资源的引用,并且仅在没有剩余引用时才释放它们,以免搞砸某些事情。
知道如何以干净的方式解决这个问题吗?
PS:有没有办法以某种方式实际获取引用计数?
提前致谢!
制造 import/export
最佳答案
我建议您查看caching或引用计数。弱引用从来不打算用作缓存系统。
.NET 中没有“引用计数”;对象要么被引用,要么未被引用。如果您需要实际的引用计数,那么我建议基于 Rx library 中的 RefCountDisposable
进行构建。 ,这是一个引用计数的 IDisposable
。
关于c# - 关于弱引用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2840708/