2014-11-14 5 views
0

У меня есть небольшое приложение winform C#, которое имеет только одну форму и имеет только объект notifyIcon. Форма никогда не отображается на самом деле. Я закодировал значок уведомления, чтобы обновить свойство .Text, когда мышь перемещается по значку. Я заметил, что память постоянно увеличивается с шагом в 8 байт, когда я нажимаю на нее мышь.Сообщить об ошибке утечки памяти?

Я уверен, что это факт, что я снова устанавливаю свойство .Text. Поскольку строка неизменна, а новый создается с каждым сеттером, я могу это понять, но я подумал, что в конце концов сборщик мусора очистит все.

Что мне делать, чтобы память не увеличивалась? Я исключил возможность того, что объект 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

Зачем вам нужно увеличивать память? Вы получаете исключение из памяти? – Roger

+4

Как вы смотрите на использование памяти? Если вы смотрите диспетчер задач, знайте, что он не является надежным. Вы * наверняка *, что память увеличивается без ограничений? У вас закончилась память таким образом? Если вы продолжаете работать, уровень использования памяти отключается через некоторое время? Сборщик мусора позволит немного увеличить потребление памяти перед очисткой. Нет особых причин для его очистки до тех пор, пока не будет никакого чрезмерного давления памяти. Самое главное, очень маловероятно, что код, который вы показываете, является фактической утечкой памяти. –

+0

Только для тестирования: вызовите 'GC.Collect' после назначения новой строки' notifyIcon1.Text'. Затем проверьте, продолжает ли память продолжать установку – Fabio

ответ

1

В своем коде, это очевидно string.Format(..) функция, которая выделяет память.
Как вы можете видеть здесь, метод возвращает «копию» вашей строки: http://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Format_Returns
Обратите внимание, что как указано в комментариях, ваш код определенно не создает утечку памяти, сборщик мусора - это просто ленивая реализация, и это вероятно, не имеет причины собирать неиспользуемую память, так как ее так мало.

Смежные вопросы