none
Утечка памяти Dispatcher Timer RRS feed

  • Вопрос

  • AutoUpdateTimer.Interval = new TimeSpan(0, 5, 0);
    AutoUpdateTimer.Tick += AutoUpdateTimerTick;
    AutoUpdateTimer.Start();
    
    void AutoUpdateTimerTick(object sender, EventArgs e)
    {
          TaskMTUpdate(sender, e);
    }
    Каждые 5 минут выполнятся AutoUpdateTimerTick и я заметил, что со временем объем занимаемой памяти растет и не уменьшается. Если выполнить "вручную" AutoUpdateTimerTick, то такого не происходит. Вероятно, остаются, какие привязки из-за которых сборщик мусора не может отработать нормально. Не подскажите как решить эту задачу?

    20 января 2015 г. 7:28

Ответы

  • Хм, а что значит, только первоначально помогает?

    Итак, чтобы делал я:

    1. Запустил приложение и записал объем использованной памяти.

    2. Подождал час

    3. Если объем использованной памяти увеличился, то свернул бы окно и опять развернул

    4. Если объем использованной памяти упал примерно до зафиксированного в 1, то не занимался бы преждевременной оптимизацией

    5. Если в 4 объем памяти не упал, то добавил бы кнопку вызывающую Collect у сборщика мусора и после часа работы нажал бы ее с интервалом в минуту 3-4 раза (из-за больших объектов и особенности трех уровней).

    6. Если объем использованной памяти упал примерно до зафиксированного в 1, то не занимался бы преждевременной оптимизацией

    7. Если в 6 объем не упал, то запустил бы профилер и начал смотреть, где же у меня создаются объекты на которые остаются ссылки (подписывание на события, один из самых распространенных вариантов)

    • Помечено в качестве ответа Evgeniy Nikulov 20 января 2015 г. 9:35
    20 января 2015 г. 9:28
    Отвечающий

Все ответы

  • в
    TaskMTUpdate(sender, e);
    Происходит выполнение запроса, обновление UI и последующее удаление всех объектов UI(ListBox) перед следующим выполнением запроса.
    20 января 2015 г. 7:42
  • Добрый день.

    Это очень плохая практика, но вы можете попробовать вызвать сборку мусора и посмотреть, упадет ли использование памяти. Если да, то не волнуйтесь, как только памяти приложению перестанет хватать, оно само ее освободит. Вызвав эту самую сборку мусора в автоматическом режиме. Можно еще попробовать свернуть приложение и посмотреть, упадет ли использование памяти.

    20 января 2015 г. 8:10
    Отвечающий
  • Если это плохая, то как тогда сделать переодически выполняющиеся действия? Банальные часы электронные как посоветуете реализовать?

    20 января 2015 г. 8:46
  • Сворачивание не помогает и сборка мусора только поначалу помогает..

    Вот так вроде помогает.

    AutoUpdateTimer.Interval = new TimeSpan(0, 5, 0); AutoUpdateTimer.Tick += AutoUpdateTimerTick; AutoUpdateTimer.Start(); void AutoUpdateTimerTick(object sender, EventArgs e) {

    AutoUpdateTimer.Tick -= AutoUpdateTimerTick; TaskMTUpdate(sender, e);

    AutoUpdateTimer.Tick += AutoUpdateTimerTick; }

    20 января 2015 г. 9:20
  • Хм, а что значит, только первоначально помогает?

    Итак, чтобы делал я:

    1. Запустил приложение и записал объем использованной памяти.

    2. Подождал час

    3. Если объем использованной памяти увеличился, то свернул бы окно и опять развернул

    4. Если объем использованной памяти упал примерно до зафиксированного в 1, то не занимался бы преждевременной оптимизацией

    5. Если в 4 объем памяти не упал, то добавил бы кнопку вызывающую Collect у сборщика мусора и после часа работы нажал бы ее с интервалом в минуту 3-4 раза (из-за больших объектов и особенности трех уровней).

    6. Если объем использованной памяти упал примерно до зафиксированного в 1, то не занимался бы преждевременной оптимизацией

    7. Если в 6 объем не упал, то запустил бы профилер и начал смотреть, где же у меня создаются объекты на которые остаются ссылки (подписывание на события, один из самых распространенных вариантов)

    • Помечено в качестве ответа Evgeniy Nikulov 20 января 2015 г. 9:35
    20 января 2015 г. 9:28
    Отвечающий
  • в
    TaskMTUpdate(sender, e);
    Происходит выполнение запроса, обновление UI и последующее удаление всех объектов UI(ListBox) перед следующим выполнением запроса.
    В VS есть анализатор кода. Пустите его - он подскажет какие Disposable-объекты Вы забыли "отпустить".

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    20 января 2015 г. 11:49