2014-11-06 140 views
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被称为它的周期15secs的后会写doc_folderDestination。这是我想要实现的。但是上面的代码似乎在泄漏内存,内存永远不会返回。所以如果有人能够帮助优化它,那会很好。

+3

注意:你的'定时器'有资格进行垃圾回收。您需要存储定时器的引用以防止它被GC'd。 – 2014-11-06 06:31:44

+0

我很好奇,为什么你用'Task.Delay'评论解决方案?正如@SriramSakthivel提到的那样,你的计时器将由GC收集,你的代码永远不会执行。 'Task.Delay'在这里更容易。 – Dennis 2014-11-06 06:47:33

+0

@丹尼斯:代码执行,我有15秒的效果,但我更关心的内存问题 – user726720 2014-11-06 06:52:40

回答

2

System.Threading.Timer实现IDisposable。

将它包装在using语句中以确保它正确地处置。

如果计时器的目的是延迟执行,另一种方法可以使用新的线程并执行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

你能举个例子 – user726720 2014-11-06 06:37:22

+0

如果你用using语句包装它,回调将不会被激发,因为这个定时器已经被处理:( – 2014-11-06 06:52:17

+0

所以在回调中处理它。 – Enigmativity 2014-11-06 06:59:19