博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF的TextBox产生内存泄露的情况
阅读量:6481 次
发布时间:2019-06-23

本文共 2083 字,大约阅读时间需要 6 分钟。

前段时间参与了一个WPF编写的项目,在该项目中有这样一个场景:在程序运行过程中需要动态地产生大量文本信息,并追加WPF界面上的一个TextBox的Text中进行显示。编写完之后,运行该项目的程序,发现在产生大量信息之后,发现系统变慢了,打开任务管理器才发现,该项目的程序占用了将近1.5G的内存(天啊!!!这不是一般的耗内存啊!!!)。后来通过查资料和探索才发现了WPF的TextBox在追加Text显示文本时会造成内存泄露。下面通过一个小Demo程序来展示一下这个内存泄露。

 

我的Demo程序很简单,就是在界面上显示一个TextBox和一个Button,点击Button后就从0到9999进行for循环并将这些数字追加的TextBox的Text中进行显示。代码如下,

MainWindow.xaml
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{    ///     /// MainWindow.xaml 的交互逻辑    ///     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;        }    }}

界面如下所示:

 

内存泄露情况

最初我们采用的是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的循环)。

 

转载地址:http://dgfuo.baihongyu.com/

你可能感兴趣的文章
n!素因子p的幂 swjtuOJ 2090【数论】
查看>>
UT-Exynos4412 三星ARM四核旗舰开发平台android4.0体验-13串口功能调试
查看>>
设计模式状态
查看>>
day44-Celery异步分布式
查看>>
Android学习之Android studio TraceView和lint工具的使用具体解释
查看>>
python做var模型的滞后阶数怎么确定_请问关于VAR模型的滞后阶数怎么确定?
查看>>
java多线程理解_三个趣味故事,让你如何理解Java多线程!
查看>>
java 获取温度_Java利用RXTX串口通信工具类获取DS18B20温度传感器的温度值
查看>>
active控件和java脚本_【学习笔记】在原生javascript中使用ActiveX和插件
查看>>
android lua调用java_android lua 在java 中的应用实例
查看>>
java concurrency 线程_JAVA CONCURRENCY EXECUTORS 介绍Java并发处理线程池
查看>>
java equals方法可变_Java性能优化(7):改写equals时遵守通用约定
查看>>
Java怎么输入秒打印出时分_1.java小作业-计算1到100的整合-指定输入多少行输出就打印多少行-打印24小时60分钟每一分钟-重载基础练习-面向java编程初学者...
查看>>
java8 functionalinterface注解_JDK8 新特性 @FunctionalInterface 函数式接口
查看>>
java订单编号工具类_[idmiss-common] Java 工具类之- 顺序订单号的生成
查看>>
php认识正则吗,浅谈PHP正则表达式的一点理解
查看>>
php生成excel到服务器,PHPExcel写入Excel并保存到服务器?
查看>>
PHP限制上次文件只能是图片,php如何控制用户对图片的访问 PHP禁止图片盗链
查看>>
php替换颜色,php Hex RGB颜色值互换的使用
查看>>
PHP的Socket通信之UDP篇,PHP的Socket通信之UDP通信实例
查看>>