Devforce Make Weak事件处理程序扩展会造成内存泄漏吗?

时间:2014-07-14 18:14:01

标签: devforce

(我在DFlight中使用DF 7.2.3)

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

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

以下是我使用MakeWeak的方法:

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

方法 EntityManagerCreated 内部

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

1 个答案:

答案 0 :(得分:1)

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

http://1drv.ms/1tb6tXH