C# 如何正确处理事件以避免内存泄漏?
我有一个WPF应用程序。有内存泄漏。我很难找到确切的原因 尝试使用ANTS profiler,我发现最好的是 我有一个事件C# 如何正确处理事件以避免内存泄漏?,c#,.net,wpf,memory-leaks,C#,.net,Wpf,Memory Leaks,我有一个WPF应用程序。有内存泄漏。我很难找到确切的原因 尝试使用ANTS profiler,我发现最好的是 我有一个事件公共事件操作注册表PropertyChanged 在我的代码中,我还有很多其他的事件正在注册到那个事件中 比如说 preferences.RegistryPropertyChanged+= new Action (SetupToolTips); 他们中的一些人正以这种方式注册 preferences.RegistryPropertyChanged += OnMSChange
公共事件操作注册表PropertyChanged
在我的代码中,我还有很多其他的事件正在注册到那个事件中
比如说
preferences.RegistryPropertyChanged+= new Action (SetupToolTips);
他们中的一些人正以这种方式注册
preferences.RegistryPropertyChanged += OnMSChanged;
使用哪种方式更好,动态还是静态?知道是什么导致了泄漏吗
我尝试删除注册表属性更改所使用的所有行后,没有泄漏。所以,所有这些事件都有问题,但我找不到确切的原因。任何想法和帮助都值得赞赏。谢谢这是一篇关于事件、弱事件等的非常好的帖子。这是一个很好的起点来找到你的记忆
编辑:如果您想要一个qiuck和脏测试。获取您认为未正确收集的组件,并将其添加到您的组件中,然后运行您的应用程序
private byte[] myMemoryTest = new byte[300 * 1024 * 1024]; //allocate 300MB
如果您的内存在taskmanager中增长而没有回退,您就会知道它没有按照您想要的方式收集。是一篇关于事件、弱事件等的非常好的帖子。这是一个很好的起点来找到你的记忆
编辑:如果您想要一个qiuck和脏测试。获取您认为未正确收集的组件,并将其添加到您的组件中,然后运行您的应用程序
private byte[] myMemoryTest = new byte[300 * 1024 * 1024]; //allocate 300MB
如果taskmanager中的内存增长且没有回退,则在处理对象时,您知道内存的收集方式不符合您的要求,请确保事件在dispose上解耦。
例如:
preferences.RegistryPropertyChanged -= OnMSChanged
另外,我有一个问题,我有一个通过成员引用承载其他对象的对象。如果您正在处理许多对象,则在处理完该对象后,很可能没有删除内存引用
举个例子,但如果您有一个Car对象,并且它承载一个Engine对象,请确保在使用Car对象时将Engine对象成员引用设置为NULL。
您需要这样做,因为即使有一个引用返回到系统中某个地方正在使用的对象,这些对象也不会被处理,因为它们是“活动的”
这都是非常高的级别,但我希望它能有所帮助。处理对象时,请确保事件在dispose上解耦。
例如:
preferences.RegistryPropertyChanged -= OnMSChanged
另外,我有一个问题,我有一个通过成员引用承载其他对象的对象。如果您正在处理许多对象,则在处理完该对象后,很可能没有删除内存引用
举个例子,但如果您有一个Car对象,并且它承载一个Engine对象,请确保在使用Car对象时将Engine对象成员引用设置为NULL。
您需要这样做,因为即使有一个引用返回到系统中某个地方正在使用的对象,这些对象也不会被处理,因为它们是“活动的”
<>这是非常高的水平,但我希望它有帮助。你认为什么是“内存泄漏”?应用程序是否会导致系统内存问题?事件处理程序是否多次连接而未分离?并显示内存泄漏。。我的意思是,若我离开应用程序,几个小时后,内存将增长20 MB。我有一些定时器,它们触发了这个事件@乔伊,我猜他们是被连接的,没有分离。但是代码真的很大,我不知道把它们放在什么地方。这是泄露的原因吗?你到底认为什么是“内存泄漏”?应用程序是否会导致系统内存问题?事件处理程序是否多次连接而未分离?并显示内存泄漏。。我的意思是,若我离开应用程序,几个小时后,内存将增长20 MB。我有一些定时器,它们触发了这个事件@乔伊,我猜他们是被连接的,没有分离。但是代码真的很大,我不知道从哪里分离它们。这是泄漏的原因吗?感谢非常有趣的文章。感谢非常有趣的文章。谢谢我会尝试这样做。谢谢我会尝试这样做。