Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确处理事件以避免内存泄漏?_C#_.net_Wpf_Memory Leaks - Fatal编程技术网

C# 如何正确处理事件以避免内存泄漏?

C# 如何正确处理事件以避免内存泄漏?,c#,.net,wpf,memory-leaks,C#,.net,Wpf,Memory Leaks,我有一个WPF应用程序。有内存泄漏。我很难找到确切的原因 尝试使用ANTS profiler,我发现最好的是 我有一个事件公共事件操作注册表PropertyChanged 在我的代码中,我还有很多其他的事件正在注册到那个事件中 比如说 preferences.RegistryPropertyChanged+= new Action (SetupToolTips); 他们中的一些人正以这种方式注册 preferences.RegistryPropertyChanged += OnMSChange

我有一个WPF应用程序。有内存泄漏。我很难找到确切的原因

尝试使用ANTS profiler,我发现最好的是

我有一个事件
公共事件操作注册表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。我有一些定时器,它们触发了这个事件@乔伊,我猜他们是被连接的,没有分离。但是代码真的很大,我不知道从哪里分离它们。这是泄漏的原因吗?感谢非常有趣的文章。感谢非常有趣的文章。谢谢我会尝试这样做。谢谢我会尝试这样做。