计时器吞噬记忆(每秒3MB)
本文关键字:3MB 每秒 吞噬 记忆 计时器 | 更新日期: 2023-09-27 18:21:11
我在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。
您是否在断开连接时关闭了通信?在第一次断开连接时,您需要关闭通信,然后定期检查是否重新连接,然后重新启动连接。