当前位置:首 页 > 攻城湿 >Windows > 查看文章

WPF:警惕TextBox会占用过多内存

Windows 你是第2403个围观者 2条评论 供稿者: 标签:, ,

问题源自这篇文章:WPF的TextBox产生内存泄露的情况

整个问题是这样的,文章作者演示使用类似下方的代码来不停地像WPF的TextBox控件赋值:

for (int i = 0; i < 10000; i++)
{
    //tbx是界面上的TextBox变量
    tbx.Text += string.Format("{0}\n", i);
}

然后会出现程序占用过多内存的问题。

很快在那篇文章的评论中有人指出这个和WPF没有关系,因为频繁得拼接字符串会产生过多重复字符串对象,即使不显示在TextBox控件上,也会会占用过多内存的。

但是原文作者又在回复中讲到他做了相关测试,但是却不会出现占用非常多的内存的情况。

最后问题不了了之。

我做了下测试,一种是不断拼接字符串并显示在TextBox中:

//我们就拿个小数字1万来做示例
for (int i = 0; i < 10000; i++)
{
    //tbx是界面上的TextBox变量
    tbx.Text += string.Format("{0}\n", i);
}

程序运行后任务管理器显示55.5 MB的内存。(环境:.NET 4.5/Debug编译/64位)

接着测试另一种情况:先拼接字符串,最后才显示在TextBox中:

var str = String.Empty;

//我们就拿个小数字1万来做示例
for (int i = 0; i < 10000; i++)
{
    //tbx是界面上的TextBox变量
    str += String.Format("{0}\n", i);
}

tbx.Text = str;

运行后显示24.1 MB。

如果把最后一句删掉,也就是根本不在TextBox中显示。运行后是23.4 MB。

很明显,整个问题确实是和WPF有关系的,但也不是因为原文作者认为的字符串拼接所造成的。真正的问题是TextBox(更准确地说是其父类:TextBoxBase)的UndoLimit属性。也就是说TextBox会因为频繁修改值而堆积过多的撤销项目项目。就如同Visual Studio的撤销列表一样:

这部分项目会占用过多的内存空间。

在.NET 3.5和4.0:TextBoxBase.UndoLimit的值默认是-1。代表如果内存够用的话,撤销列表会无限大。(这个有点恐怖)

在.NET 4.5中:TextBoxBase.UndoLimit的值默认是100。

我们可以吧TextBoxBase.UndoLimit设置成0(或者把IsUndoEnabled设置成False),也就是命令TextBox不支持撤销功能。再次运行第一次的代码:

//禁止撤销
tbx.UndoLimit = 0;

for (int i = 0; i < 10000; i++)
{
    //tbx是界面上的TextBox变量
    tbx.Text += string.Format("{0}\n", i);
}

运行后,任务管理器显示29.4 MB(几秒后又变成了24 MB)。而没有设置UndoLimit,也就是.NET 4.5中默认值是100的情况下,占用内存则能飙升到55.5 MB。在.NET 3.5或者4下可能会更大,因为默认是没有限制的。

那么问题的解决方案是:

适当设置WPF的TextBox.UndoLimit(尤其是.NET 3.5/4.0环境下,默认值-1太可怕了)。当然这仅仅应用在频繁设置TextBox值的情况下,如果没有此类情况,无需担心。另外也要注意如果要进行频繁字符串拼接操作,请使用TextBoxBase.AppendText或者StringBuilder。

文章来源:http://www.cnblogs.com/mgen/archive/2013/02/24/2924558.html

这家伙很懒,什么都没写!

—— zhaorong

zhaorong
你可能也喜欢Related Posts
众说纷纭Comments
大眼 可爱 大笑 坏笑 害羞 发怒 折磨 快哭了 大哭 白眼 晕 流汗 困 腼腆 惊讶 憨笑 色 得意 骷髅 囧 睡觉 眨眼 亲亲 疑问 闭嘴 难过 淡定 抗议 鄙视 猪头
小提示:直接粘贴图片到输入框试试
努力发送中...
  1. 1 楼

    某男半夜出去吃宵夜。吃到一半的时候,老板娘跑过来神秘地说: 要不要丫头? 某人当时就乐呵了,心想这服务行业也太发达了。赶紧来一个吧。两分钟过后,老板娘端上来一盘鸭头。。。

    2014年01月17日 08:50:36 回复 取消回复
  2. 2 楼 访客

    7、成功的骗子,不必再以说谎为生,因为被骗的人已经成为他的拥护者,我再说什么也是枉然。

    2014年01月18日 07:29:50 回复 取消回复
  • 评论最多
  • 最新评论
  • 随机文章
footer logo
未经许可请勿自行使用、转载、修改、复制、发行、出售、发表或以其它方式利用本网站之内容
Copyright © zhaorong All Rights Reserved. 滇ICP备15006105号-1