c# - 关于弱引用的问题

标签 c#

我有一个关于弱引用的问题。

我现在正在编写一个“资源管理器”,它必须保留对创建的纹理对象的引用。我有一个字典,例如:

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/

相关文章:

c# - 未发出 startdocprinter 调用 OnEndPrint

c# - VBA 对象浏览器不显示我的 .NET dll 库中的类成员

c# - 为 ItemsControl 创建可重用的 DataTemplate 资源

c# - 如何使用简单注入(inject)器模拟模块/安装程序/注册表

c# - 获取参数的调用变量名

c# - 同时查找和映射

c# - 在 prsim 模型中使用 ValueConverter

c# - 使用 C# 读取基于 HTML 的 XLS 时出现问题

java - Lotus Notes 日历报告

c# - 简洁轻量的API : REST+JSON in . NET