我正在使用Windows服务从银行获取帐户信息;我的服务运行良好,但在几天后(8天或更长时间),它使用超过7千兆字节的RAM。(有6或7个线程);
这是我的代码:
private Thread MainThread;
protected override void OnStart(string[] args)
{
try
{
ThreadStart starter = new ThreadStart(() => ConfigurationService());
MainThread = new Thread(starter);
MainThread.Start();
// Event Started
}
catch (Exception ex)
{
}
}
protected override void OnStop()
{
MainThread.Abort();
EventLog.WriteEntry("Service Aborted", EventLogEntryType.Information);
}
以下是我的方法,决定哪一天必须收到信息;
private void ConfigurationService()
{
serv = new ServiceSoapClient();
serv.Endpoint.Binding.CloseTimeout = serv.Endpoint.Binding.OpenTimeout = serv.Endpoint.Binding.ReceiveTimeout = serv.Endpoint.Binding.SendTimeout = TimeSpan.FromSeconds(30);
DateTime startTime = DateTime.Parse(@"2012/05/20");
while (true)
{
try
{
Thread.Sleep(TimeSpan.FromMinutes(1));
double days = DateTime.Now.Subtract(startTime).Days;
if (days > 30)
{
GetDataFromBank(startTime, startTime.AddDays(30));
startTime = startTime.AddDays(31);
}
else
{
GetDataFromBank(startTime, startTime.AddDays(days));
startTime = startTime.AddDays(days);
}
}
catch (Exception ex) { }
}
}
这是主要方法(从银行接收数据的线程):
private void GetDataFromBank(DateTime fromDT, DateTime toDT)
{
ThreadPool.QueueUserWorkItem(new WaitCallback((o) =>
{
try
{
while (true)
{
if (fromDT > toDT)
break;
try
{
// Call The Bank Service
// Receive Transaction related to Specified Date
// Compare with Database if not Exist Add To Database
}
}
fromDT = fromDT.AddDays(1);
}
}
catch (Exception ee)
{
EventLog.WriteEntry(ee.Message, EventLogEntryType.Error);
}
}));
}
该服务运行良好并从StartDate接收所有信息,直到EndDate; 几乎1小时后服务只需每分钟检查一次CurrentDay,在TaskManager中我看到5或6个活动线程和内存使用量等于24兆字节;
问题:为什么服务在几天后会使用超过7千兆字节的内存?
提前致谢
编辑===========
我忘了告诉你我从不关闭电脑。
答案 0 :(得分:3)
当然GC无法收集与List或某些集合变量相关的内存变量,在这些变量中,您可以无限地填充数据并且内存变量永远不会超出引用范围。 由于你使用无限循环而while(true)注意你在该循环中使用的集合变量。看看它是否会继续增加......
您使用EF还是某些ORM?如果是,请检查是否始终向EF全局上下文添加条目?