计时器吞噬记忆(每秒3MB)



我在c#上编写了应用程序,它使用很少的定时器(4个定时器)。应用程序请求在相关时间间隔内从web服务响应。如果连接了互联网,应用程序将使用12-15 Mb的内存,但当断开互联网时,应用程序会增加内存使用量(每秒3 Mb)。

我强制运行垃圾收集器,但没有改进。当互联网断开连接时,会出现一些异常,但所有这些都得到了正确的处理。

如果互联网断开连接,并且当调用shn.show*Details()方法增加内存使用量时,这是我代码的一部分。GetXML.GetResponce()在paramitter上调用webservice并以字符串形式返回回复xml,ParseXML类在上面返回xml响应解析并将其转换为对象

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
    }
}

我有一个windows服务每分钟连接到Tibco,监听队列中的消息,这个连接从未正确关闭,因此你可以继续为每个打开的连接利用更多的内存。你必须强制断开连接。

尝试在以下对象HandleUserData、Userinfo、Pre和Auth上实现dispose。

在方法InitDmsg中使用完这些对象后,调用dispose。

您是否在断开连接时关闭了通信?在第一次断开连接时,您需要关闭通信,然后定期检查是否重新连接,然后重新启动连接。

最新更新