2014-11-06 3 views
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은 15secs의 기간 후에 _folderDestinationdoc를 작성합니다라고합니다. 이것이 내가 원하는 것입니다. 그러나 위의 코드는 메모리 누수가되고 메모리는 결코 되돌아 오지 않습니다. 그래서 누군가가 그것을 최적화하는 것을 도울 수 있다면 그것은 좋을 것입니다.

+3

사이드 노트 : '타이머'가 가비지 수집 대상입니다. GC가 수행되지 않도록 타이머 참조를 저장해야합니다. –

+0

내가 궁금한데, 왜 당신은'Task.Delay'로 해결책을 언급 했습니까? @SriramSakthivel이 언급했듯이 타이머로 GC를 수집하므로 코드가 실행되지 않습니다. 'Task.Delay'는 여기에서 훨씬 쉽습니다. – Dennis

+0

@Dennis : 코드가 실행되고 15 초 효과가 있지만 메모리 문제가 더 걱정됩니다 – user726720

답변

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

+0

명세서를 사용하여 포장하면 타이머가 이미 처리되어 콜백이 실행되지 않습니다. ( –

+0

콜백에 처분하십시오. – Enigmativity

관련 문제