WPF的TextBox产生内存泄露的情况
2015-12-11 08:56
330 查看
前段时间参与了一个WPF编写的项目,在该项目中有这样一个场景:在程序运行过程中需要动态地产生大量文本信息,并追加WPF界面上的一个TextBox的Text中进行显示。编写完之后,运行该项目的程序,发现在产生大量信息之后,发现系统变慢了,打开任务管理器才发现,该项目的程序占用了将近1.5G的内存(天啊!!!这不是一般的耗内存啊!!!)。后来通过查资料和探索才发现了WPF的TextBox在追加Text显示文本时会造成内存泄露。下面通过一个小Demo程序来展示一下这个内存泄露。
我的Demo程序很简单,就是在界面上显示一个TextBox和一个Button,点击Button后就从0到9999进行for循环并将这些数字追加的TextBox的Text中进行显示。代码如下,
View Code
界面如下所示:
构建,启动调试后,我们查看任务管理器,此时所占内存只有16M,
点击【开始】按钮之后,等到从0输出到9999之后,我们再查看任务管理器,发现此时所占的内存飙到了600+M,
若此时再点击【开始】按钮,等循环结束,发现所占内存飙到了900+M,
再点击【开始】按钮的话,就要发生OutOfMemory异常的。当我们将循环改为从0到19999时,第一次点击【开始】按钮,我的机器就发生OutOfMemory异常了。
构建,启动调试,然后点击界面的【开始】按钮,等循环结束,我们查看任务管理器,测试Demo程序只占了29M内存(此时是从0到19999的循环)。
我的Demo程序很简单,就是在界面上显示一个TextBox和一个Button,点击Button后就从0到9999进行for循环并将这些数字追加的TextBox的Text中进行显示。代码如下,
MainWindow.xaml.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace TextBoxMemoryLeak { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void btnStart_Click(object sender, RoutedEventArgs e) { this.btnStart.IsEnabled = false; this.tbOutput.Text = ""; for (int i = 0; i < 10000; i++) { //使用此语句进行Textbox的追加会造成内存泄露 //this.tbOutput.Text += string.Format("{0}\n", i); //使用此语句进行Textbox的追加可避免内存泄露 this.tbOutput.AppendText(string.Format("{0}\n", i)); } this.btnStart.IsEnabled = true; } } }
View Code
界面如下所示:
内存泄露情况
最初我们采用的是TextBox的Text追加方式如下this.tbOutput.Text += string.Format("{0}\n", i);
构建,启动调试后,我们查看任务管理器,此时所占内存只有16M,
点击【开始】按钮之后,等到从0输出到9999之后,我们再查看任务管理器,发现此时所占的内存飙到了600+M,
若此时再点击【开始】按钮,等循环结束,发现所占内存飙到了900+M,
再点击【开始】按钮的话,就要发生OutOfMemory异常的。当我们将循环改为从0到19999时,第一次点击【开始】按钮,我的机器就发生OutOfMemory异常了。
避免内存泄露的情况
将TextBox的Text追加方式改为下面语句this.tbOutput.AppendText(string.Format("{0}\n", i));
构建,启动调试,然后点击界面的【开始】按钮,等循环结束,我们查看任务管理器,测试Demo程序只占了29M内存(此时是从0到19999的循环)。
相关文章推荐
- 第15周项目1 验证算法
- 第9周项目2对阵矩阵压缩存储的实现与应用2
- 使用FUSE挂载HDFS流程及错误集锦
- Xcode7使用MJ的NSObject+Value出现Too many arguments to function call,expected 0,have 3
- svn更新代码后,工程打不开的解决方法
- 思路很重要
- Linux RAID廉价磁盘冗余阵列
- 第15周项目1验证算法
- SIFT算法详解与代码解析
- Java中的代码点与代码单元
- 学习javascript的好地方,收藏
- C语言开发简易版扫雷小游戏
- 第十五周 项目2 用哈希法组织关键字
- 【Codeforces Round 269 (Div 2)A】【简单讨论】MUH and Sticks 6根木棍拼动物
- Unity 动画 Tag nameHash
- JSON使用ObjectCreationHandling 反序列化替换不重复的值
- 继承
- 第十五周项目3 - B-树的基本操作
- 第四周 项目四 建设双链表算法库
- 基于PHP如何把汉字转化为拼音