【问题标题】:Destroy target of WeakReference破坏弱引用的目标
【发布时间】:2015-02-26 15:38:09
【问题描述】:

我正在为我的 WPF 应用程序编写一个小型 MemoryManager 并遇到以下问题。

我做什么:我将很多实例作为WeakReference 存储在IList<WeakReference> 中。后来,当我想释放所有内存时,我想销毁列表中所有活着的对象。

为此,我尝试获取对对象的引用,如下所示:

foreach (WeakReference wr in references)
{
    if (wr.IsAlive == true)
    {
        if(wr.Target != null)
        {
            TypedReference tf = __makeref(wr.Target);
        }
    }
}

但我不知道如何销毁tf。我尝试使用__refval,但它不适合我。

示例

InstanceDestructManager idm = new InstanceDestructManager();
IList<string> test = new List<string>();
test.Add("123");

idm.AddNullable<IList<string>>(ref test);
idm.Dispose();

// Should not be possible, because after idm.Dispose "test" should be null
test.Add("456");

通用代码

public static void Test(ref object pa)
{
    pa = null;
}

也许有人有想法,谢谢!

【问题讨论】:

  • 在 .NET 中,您不会“销毁”对象。你让他们逗留,让 GC 完成它的工作。你最好的办法是现在销毁这个“小内存管理器”。
  • @HenkHolterman 好的,我会寻找新的解决方案。因为我的应用程序内存增加得非常糟糕,而且似乎 GC 在检测关闭的选项卡方面存在一些问题。或者我需要在“关闭选项卡”事件中处理所有事情。谢谢!
  • Dispose() 是关于资源,而不是关于内存。确保您首先了解问题所在。
  • 直到 OutOfMemory 异常。该应用程序通常达到 2GB 的内存。
  • 好的,这是个问题。现在找出原因。查找“内存分析器”。我们无法帮助您,afaik 选项卡不会关闭。

标签: c# weak-references destroy typedreference


【解决方案1】:

WeakReference.Target 设置为null 将释放对它的引用。在 C# 中没有销毁内存这样的东西。当没有对它的引用时,GC 会收集内存。即便如此,它也会自行决定何时释放它们。 GC.Collect 强制执行此操作。但这不是用于生产目的,除非您知道自己在做什么。

【讨论】:

  • 您的解决方案无法正常工作,因为您只将Target 设置为null,而不是设置引用的目标。
  • 目标属性是一个setter,所以是的,你可以设置目标引用的wnat
  • @Sievajat,但我不想设置引用的目标,我想将已经引用的对象设置为空。我想在我的更新下找到代码的通用解决方案:General code for
  • @BendEg :您不能将对象设置为空。这没有任何意义。
  • 也许,或者改进它。现在它正在寻求错误解决方案的帮助。
猜你喜欢
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多