У меня есть фрагмент кода, который профайлер 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 секунд. Этого я хочу достичь. Но вышеприведенный код, похоже, содержит утечку памяти, и память больше не возвращается. Поэтому, если кто-то может помочь его оптимизировать, было бы здорово.
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
}
Timer
имеет право на сборку мусора. Вам нужно сохранить ссылку на таймер, чтобы он не был GC'd.Task.Delay
? Как упомянул @SriramSakthivel, ваш таймер будет собран GC, и ваш код никогда не будет выполнен.Task.Delay
здесь намного проще.