2012-01-21 23 views
1

我有應用程序寫在c#上,它使用很少的計時器(4個計時器)。應用程序請求來自web服務的相應時間間隔的響應。如果互聯網連接應用程序使用12-15 Mb內存,但當互聯網斷開應用程序增加內存使用量(每秒3MB)。計時器進食記憶(3MB秒)

我強制運行垃圾收集器但沒有改進。 當互聯網斷開連接發生一些例外,但他們都妥善處理。

這是我的代碼的一部分,如果互聯網斷開連接,並調用shn.show * Details()方法增加內存使用GetXML.GetResponce()那麼調用webservice上paramitter並返回答覆xml作爲字符串,ParseXML類做以上返回的xml respnce解析並將其轉換爲對象

class Scheduler 
{ 
    private System.Windows.Forms.Timer dataTimer; 
    private System.Windows.Forms.Timer promoTimer; 
    private showNotifications shn; 
    public Scheduler() 
    { 

     dataTimer = new System.Windows.Forms.Timer(); 
     promoTimer = new System.Windows.Forms.Timer(); 
     shn = new showNotifications(); 
    } 

    public void scheduleDmsg(int time) 
    { 
     if (time < 1) 
     { time = 5; } 
     dataTimer.Interval = time * 60000; 
     dataTimer.Tick += new EventHandler(InitDmsg); 
     dataTimer.Enabled = true; 
    } 

    public void schedulePmsg(int time) 
    { 
     if (time < 1) 
     { time = 5; } 
     promoTimer.Interval = time * 60000; 
     promoTimer.Tick += new EventHandler(InitPmsg); 
     promoTimer.Enabled = true; 
    } 

    private void InitDmsg(Object source, EventArgs e) 
    { 
     try 
     { 
      //--------------------at the start of app------------------ 
      showNotifications shn = new showNotifications(); 
      HandleUserData hud = new HandleUserData(); 
      Userinfo uin = hud.ReadUserData(); 

      XmlDocument xmlDoc = new XmlDocument(); 

      xmlDoc.InnerXml = GetXML.GetResponse(new Uri("auth service url"));// this web service use to authenticate user by ip address 
      Auth authDetails = ParseXML.ParseAuth(xmlDoc); 

      try 
      { 
       if (authDetails.SUB.Equals("no_entry")) // if authenicated no_entry become >> <11 digit number> 
       { } 
       else 
       { 
        //if authenticated 
        xmlDoc.InnerXml = GetXML.GetResponse(new Uri("info url")); 
        Pre preDetails = ParseXML.ParsePre(xmlDoc); 

        switch (preDetails.SUB_TYPE) 
        { 
         case "1": 
          shn.showPreDetails(); //showPreDetails method display some information on cusom notification message 
          break; 
         case "2": 
          shn.showPostDetails();//showPostDetails method display some information on cusom notification message 
          break; 
         case "3": 
          shn.showPreDetails(); 
          break; 
         case "4": 
          shn.showPreDetails(); 
          break; 
         case "5": 
          shn.showPostDetails(); 

          break; 
         default: 
          break; 

        } 

       } 
      } 
      catch (Exception ex) 
      { 
       //MessageBox.Show("Error Occured"); 
      } 
     } 
     catch (Exception ex) 
     { 

     } 



    } 
    private void InitPmsg(Object source, EventArgs e) 
    { 
     //shn.showPromoMsgs(); 
     showNotifications.showPromoMsgs(); ////showPromoDetails method display some information on cusom notification message 
    } 
} 
+1

你將不得不張貼一些代碼給我們看看發生了什麼。最有可能的是,由於懸掛引用對象導致內存泄漏。強制GC運行並不能解決這個問題。 –

+0

方法'scheduleDmsg'多久使用一次?它在每次通話中訂閱Tick事件。是否有任何事情釋放訂閱?在應用程序的form_load中調度scheduleDmsg和schedulePmsg一次,調用時間爲 –

+0

。 –

回答

2

我有一個windows服務,每分鐘連接到Tibco,監聽隊列中的消息,這個連接從未正確關閉,因此您每次打開的連接都會繼續使用更多的內存。你必須強制斷開連接。

嘗試並實施處理HandleUserData,Userinfo,Pre和Auth的以下對象。

當您在InitDmsg方法中完成使用它們時,請調用這些對象的處置。

1

您是否正在關閉斷開連接的通信?在首次斷開連接時,您需要關閉通信,然後定期檢查是否重新連接,然後重新開始連接。