Служба Windows, память увеличивается каждый раз, когда она получает данные из Active Directory - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть служба Windows.Эта служба получает данные пользователя из Active Directory, а затем сохраняет файл XML в локальной системе.Сервис использует таймер, чтобы работать через каждые (скажем так) 10 минут.При первом запуске он занимает около 85 МБ памяти, через 10 минут - 118 МБ и т. Д.Каждый раз, когда он работает, он потребляет дополнительную память.

Может ли кто-нибудь помочь мне понять, чего мне здесь не хватает.

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);
    RunService();
    //this.Stop();
}
protected override void OnStop()
{
    //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);


}

private void RunService()
{
    _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();                       
}

 void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    RunService();
    StartProcess();
}

1 Ответ

2 голосов
/ 24 февраля 2011

Похоже, что каждый раз, когда вы звоните 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...