Похоже, что каждый раз, когда вы звоните RunService()
, вы создаете новый Timer
, но не избавляетесь от старого.
РЕДАКТИРОВАТЬ
Глядя наваш код немного больше вы на самом деле создаете новый Timer
довольно часто.Ваш сервис начинается с OnStart()
, который вызывает StartProcess()
, который вызывает RunService()
.Когда таймер в этом методе срабатывает, вы вызываете и RunService()
, и StartProcess()
, последний, который снова вызывает RunService()
.
Вот как я почти уверен, что код должен действительно выглядеть, я полностью получилизбавиться от метода RunService()
и инициализировать таймер один раз в StartProcess()
protected override void OnStart(string[] args)
{
StartProcess();
}
private void StartProcess()
{
sEvent = "AD XML Generator Started at " + System.DateTime.Now.ToString();
if (!EventLog.SourceExists(sSource))
EventLog.CreateEventSource(sSource, sLog);
EventLog.WriteEntry(sSource, sEvent);
ActiveDirectoryGenericFunctions obj = new ActiveDirectoryGenericFunctions();
obj.GenerateXMLFileForAllUsers(DomainA, DomainB, xmlFileName);
//Create the timer once
if(_timer != null){
_timer = new Timer();
_timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
_timer.AutoReset = true; // AutoReset = true means after specified interval the timer'll automatically be restarted
_timer.Interval = Convert.ToDouble(ConfigurationManager.AppSettings["ServiceHour"].ToString());// 300000; //5minutes// (0.1*60*60*1000); // specify some interval here in milliseconds e.g. 4 hours (4*60*60*1000)
_timer.Start();
}
}
protected override void OnStop()
{
//Dispose the timer
_timer.Dispose();
//Write to Event Log - Stop of Service also written to Evenbt automatically
sEvent = "AD XML Generator Stopped at " + System.DateTime.Now.ToString();
if (!EventLog.SourceExists(sSource))
EventLog.CreateEventSource(sSource, sLog);
EventLog.WriteEntry(sSource, sEvent);
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
StartProcess();
}