Утечка памяти при использовании таймеров

1

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

      public void printXML(XmlDocument doc)
        {
            //System.Threading.Timer timer = null;
            XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true };
            new System.Threading.Timer((_) =>
            {
                using (var writer = XmlWriter.Create(_folderDestination, settings))
                {
                    //                Task.Delay(15000).ContinueWith(_ => doc.Save(writer));                
                    doc.Save(writer);
                }
            }).Change(15000, -1);

        }

Каждый раз, когда printXML метод printXML он записывает doc в _folderDestination через период 15 секунд. Этого я хочу достичь. Но вышеприведенный код, похоже, содержит утечку памяти, и память больше не возвращается. Поэтому, если кто-то может помочь его оптимизировать, было бы здорово.

  • 3
    Примечание: Ваш Timer имеет право на сборку мусора. Вам нужно сохранить ссылку на таймер, чтобы он не был GC'd.
  • 0
    Мне любопытно, почему вы прокомментировали решение с Task.Delay ? Как упомянул @SriramSakthivel, ваш таймер будет собран GC, и ваш код никогда не будет выполнен. Task.Delay здесь намного проще.
Показать ещё 9 комментариев
Теги:
timer

1 ответ

2
Лучший ответ

System.Threading.Timer реализует IDisposable.

Оберните его внутри инструкции, чтобы убедиться, что она правильно установлена.

Если целью таймера является отсрочка выполнения, альтернативный способ может использовать новый поток и выполнить Thread.Sleep.

    public void printXML(XmlDocument doc)
    {
        var thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(DelayPrint));
        thread.Start(doc);
    }

    void DelayPrint(object param)
    {
        System.Threading.Thread.Sleep(15000);              
        XmlDocument doc = param as XmlDocument;
        // Do Work
    }
  • 0
    можешь показать пример
  • 0
    Если вы включите его в оператор using, обратный вызов не будет запущен, поскольку таймер уже настроен :(
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню