Windows服务中的线程和缺乏Ram内存

时间:2013-12-07 15:18:19

标签: c# multithreading windows-services threadpool

我正在使用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千兆字节的内存?

提前致谢

编辑===========

我忘了告诉你我从不关闭电脑。

1 个答案:

答案 0 :(得分:3)

当然GC无法收集与List或某些集合变量相关的内存变量,在这些变量中,您可以无限地填充数据并且内存变量永远不会超出引用范围。 由于你使用无限循环而while(true)注意你在该循环中使用的集合变量。看看它是否会继续增加......

您使用EF还是某些ORM?如果是,请检查是否始终向EF全局上下文添加条目?