Windows服务内存使用量增加

时间:2017-01-10 19:02:08

标签: c# multithreading memory-leaks timer windows-services

我有一个Windows服务做3个预定的工作。他们中的第一个是向员工发送他们班次的电子邮件。第二个是获取Active Directory信息并将其保存到本地数据库。最后一个是将活动目录照片保存到文件目录。

每个作业都在一个单独的线程上完成。计时器每45秒滴答一次。除了服务的内存使用量正在稳步增长之外,一切都运行良好。

你知道可能导致这种情况的原因吗?

onResume

2 个答案:

答案 0 :(得分:1)

这个只是一些想法

  1. ActiveDirectorySmcpClient(如果您没有将其用于电子邮件,请更正我)使用意味着您正在处理非托管资源,您是否正确处理了这些类?您可能应该将客户端变量设置为静态字段,并将它们放在程序的末尾。
  2. 这些内容对我来说不清楚:

    if (thread[i].ThreadState != System.Threading.ThreadState.Running)
    {
        if (TimeControl.CheckTime(DateTime.Now, servisList.ElementAt(i).sProps))
        {
            thread[i] = new System.Threading.Thread(new System.Threading.ThreadStart(servisList.ElementAt(i).NotifyUsers));
            thread[i].Start();
        }
    }
    

    Thread也是非托管资源,因此,在实现IDisposable时,您应该在为数组条目分配新值之前处置上一个:thread[i].Dispose(); < / p>

  3. minor 为什么使用已添加using System.Threading的全名?

答案 1 :(得分:0)

AFAICT,如果没有关于你在NotifyUsers方法中做了什么的更具体的信息,就无法回答这个问题。

但是在研究之前,我首先会重新审视这个线程产生的逻辑,你已经有了这个

if (thread[i] == null)
{
   // (code omitted)
}
else
{
   // (code omitted)
}

通过这种方式,我的意思是,首先要弄清楚你的服务是否最终会产生太多的工作线程(这是我的猜测,先验)。

更具体地说,每当您使用System.Threading.Thread时,请始终将race condition视为首先/最可能发现的问题之一。

多线程绝非易事。但plenty of resources可以帮助您顺利完成任务。

'希望这会有所帮助。

相关问题