我有一个Windows服务做3个预定的工作。他们中的第一个是向员工发送他们班次的电子邮件。第二个是获取Active Directory信息并将其保存到本地数据库。最后一个是将活动目录照片保存到文件目录。
每个作业都在一个单独的线程上完成。计时器每45秒滴答一次。除了服务的内存使用量正在稳步增长之外,一切都运行良好。
你知道可能导致这种情况的原因吗?
onResume
答案 0 :(得分:1)
这个只是一些想法
ActiveDirectory
和SmcpClient
(如果您没有将其用于电子邮件,请更正我)使用意味着您正在处理非托管资源,您是否正确处理了这些类?您可能应该将客户端变量设置为静态字段,并将它们放在程序的末尾。这些内容对我来说不清楚:
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>
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可以帮助您顺利完成任务。
'希望这会有所帮助。