我有一个小型的c#winform应用程序,它只有一个表单而且只有一个notifyIcon对象。表格永远不会显示出来。当鼠标移到图标上时,我编写了通知图标来更新.Text属性。我注意到当我将鼠标移到它上面时,内存稳定增加,增量为8个字节。
我确信这是我一遍又一遍地设置.Text属性的事实。由于字符串是不可变的,并且每个setter都创建了一个新字符串,我可以理解这一点,但我认为垃圾收集器最终会清理它。
我应该怎么做以防止内存增加?我已经消除了TimeSpan对象成为罪魁祸首的可能性,因为我已经尝试将它用作类级别对象,并且从不实例化它多次。这没有提供不同的结果,所以我现在每次只声明并实例化一个新的。
private const string TEMPLATE = "Time remaining: {0}h {1}m {2}s";
private void notifyIcon1_MouseMove(object sender, MouseEventArgs e)
{
TimeSpan ts = new TimeSpan((_targetTime - DateTime.Now).Ticks);
notifyIcon1.Text = string.Format(TEMPLATE, ts.Hours, ts.Minutes, ts.Seconds);
//I think it's this .Text property that's increasing the memory usage.
}
答案 0 :(得分:1)
在你的代码中,显然是分配内存的string.Format(..)
函数
正如您在此处看到的,该方法会返回字符串的“副本”:http://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Format_Returns
请注意,正如注释中所建议的,您的代码肯定不会创建内存泄漏,垃圾收集器只是一个惰性实现,它可能没有理由收集未使用的内存,因为它很少。