C#-C# winform定时器访问控件内存泄漏怎么解决?

C#-C# winform定时器访问控件内存泄漏怎么解决?

瑾兮 发布于 2017-09-29 字数 153 浏览 1288 回复 4
private void timer1_Tick(object sender, EventArgs e)
{
this.Text = DateTime.Now.ToLongDateString();
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

晚风撩人 2017-10-16 4 楼

刚才试过了,不会内存无限增长。 PS:win7(长了1M左右就停了)

灵芸 2017-10-15 3 楼

是字符串在堆中未被回收造成的,一般GC不会在内存充裕的情况下主动回收,而字符串是不变的,每次创建新的字符串导致堆中字符串数量上升,进而内存呈线性增长。这都不是事儿,全部交给GC妥妥的。

夜无邪 2017-10-02 2 楼

这个不是内存泄露,只是你之前用到的字符串全都存进了字符串池,所以字符串池变大了。那个也不是无限变大的,慢慢地之前没用的那些字符串又会从字符串池里面回收回去,但是那个过程不可能是每次都回收一点点,那样效率太低了;系统是等占用的量大了,一次回收一大堆。所以不用担心内存泄露的问题。

清晨说ぺ晚安 2017-09-30 1 楼

这个问题我研究过,是GDI非托管内存问题,timer使用错误问题,并不是内存泄漏。
也跟字符串大小没关系,因为字符串属于托管内存,所以每次使用的时候会被自动回收。但this.Text改变时会引发重绘,重绘就会引发有一段非托管内存未被回收。主线程是由Appliaction自动处理这块内存,但不会在子线程运行中处理这块内存。
而timer控件的机制是在一段时间过后,开启一个线程,引发Tick事件(实际机制是WM_TIMER消息发送到对应句柄也就是发到控件,然后开启一个线程执行)。
因为这个机制,所以存在在同一时间内有多个线程在执行显示时间的代码,又由于每次执行代码是会产生一段非托管内存,又由于多个线程同时执行会产生线程阻塞,所以你看到的现象是内存在不断增长。
你可以试试在Tick事件这么改:
timer.Enable=false;
//显示时间
timer.Enable=true;
还有当timer需要停止的时候建议加上timer.Dispose();以释放非托管内存。