我有一个应用程序,使用大约一个小时后开始放慢速度。在过去一周的过程中,我检查了内存泄漏和其他类似的基于时间的"问题。
我终于通过dotTrace探查器连接了新的TimeLine Trace。它向我展示了大部分时间都在TextBox.Clear()
方法中(约为我总共5秒延迟的3秒)。
我做了一些阅读并发现这个post说TextBox.Clear()
比将TextBox值设置为空字符串慢42倍。
但这并不能解释为什么我的应用只会在使用一小时后放慢速度。
我查看了TextBox.Clear()
方法,似乎将内容更像是一个编辑框(带有文本部分)。
重复调用Clear是否可以在文本框中创建不断增长的对象列表?
或者是否有其他人知道为什么这会在一小时内重复拨打TextBox.Clear()
时放慢速度?
更新
我刚刚发现这个post似乎表明文本框有一个没有限制的撤销堆栈。也许我的清除调用正在使该堆栈的值随着时间的推移而变慢。
更新2:
我做了一个小测试应用程序,当按下按钮时将清除文本框1500次。我按了大约30次。大约70%的时间大约需要45毫秒。但另外30%的人花了1.8和5.4秒!
我不知道为什么会有如此戏剧性的转变。尽管如此,我的应用程序可能在整个小时内有2000个明确的调用,所以这似乎并不能证明Profiler为什么说TextBox.Clear()
是问题。
答案 0 :(得分:0)
我确实知道原因,但更改为TextBox.Text = String.Empty;
修复了我的性能问题。
我回到我的发布分支并且仅更改了,现在我的应用程序运行了几个小时而没有减速。
注意:我认为这不是Undo Stack。我检查了我的应用程序的默认值(在.NET 4.5下运行)并且它被限制为100(或10,我无法回忆)。无论哪种方式,速度缓慢的计算机都没有显示任何内存压力。
如果我不得不猜测,我会说Clear已经阻止了它。探查器在Clear方法内部显示了一些相当低级别的调用。我认为其中一个是以某种方式阻止。