2012-01-21 20 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

您是否正在关闭断开连接的通信?在首次断开连接时,您需要关闭通信,然后定期检查是否重新连接,然后重新开始连接。