1

(我正在使用带有 Silverlight 的 DF 7.2.3)

在事件上使用ideablade devforce的MakeWeak扩展来处理它们作为弱引用,我认为它可以防止内存泄漏。但是我注意到所有使用 MakeWeak 的对象都没有被释放。

在对 Viewmodel 的简单测试中,如果我使用 MakeWeak 注册事件,则 GC 永远不会释放 viewmodel。如果我用标准的 += eventmethod 和 -= eventmethode 替换代码,GC 会释放视图模型。

这是我使用 MakeWeak 的方法:

entityManagerProvider.ManagerCreated += 
      new EventHandler<EntityManagerCreatedEventArgs>(EntityManagerCreated)
                       .MakeWeak(eh => entityManagerProvider.ManagerCreated -= eh);

使用EntityManagerCreated方法作为internal

这是一个错误还是我以错误的方式使用它?

4

1 回答 1

1

抱歉耽搁了。我在鸡尾酒的背景下研究了这一点,但我无法重现这一点。我没有专门研究 TempHire,因为 TempHire 中可能存在内存泄漏,而是我整理了一个非常小的示例,证明 DevForce 中的弱事件处理程序似乎没有内存泄漏。您可以从我的 OneDrive 下载示例。您应该看到三个按钮。如果单击 Create VM 按钮,它会创建一个子 VM 的新实例,该实例订阅 EntityManagerProvider 中的上述事件,并且应用程序会维护子 VM 实例的计数。最后创建的实例成为 shell 中的活动项。您可以创建任意数量的子虚拟机并查看计数器增量。每当您创建新的子虚拟机时,shell 都会释放前一个子虚拟机。单击关闭 VM 按钮以关闭当前活动的 VM。然后单击 GC 按钮触发垃圾收集,如果 shell 中仍有一个 VM 处于活动状态,您应该会看到计数器返回零或一。如果您随后转到 ChildViewModel 构造函数并将弱事件处理程序更改为 .NET 事件处理程序并重复练习,您将看到计数器永远不会归零,因为 EntityManagerProvider 保留对您创建的每个视图模型的引用。

http://1drv.ms/1tb6tXH

于 2014-08-18T19:50:39.173 回答