2013-12-07 2 views
0

Я делаю службу Windows для получения информации о счете из банка; Мой сервис работает хорошо, но через несколько дней (8 или более дней) он использует более 7 гигабайт оперативной памяти (с 6 или 7 потоками);Темы в Windows Сервис и отсутствие памяти памяти

Вот мой код:

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); 
     } 

И вот мой метод, который решает, какой день (s) информация должна получить;

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) { } 
    } 
} 

И вот основной метод (Thread для получения данных от банка):

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 гигабайт оперативной памяти?

Заранее спасибо

Редактировать ===========

Я забыл рассказать вам, что я никогда не выключайте компьютер.

+0

Похож на проблему с сборкой мусора. Возможно, вы прикрепляете обработчики событий, которые не выпущены должным образом, или вы держите ссылки на некоторые объекты, чтобы они не собирались. Вы должны рассмотреть возможность выполнения профилирования, чтобы увидеть, что занимает память. – ChrisK

+0

Нужно ли всегда иметь SoapServiceClient? Я бы предложил создать его, когда вам это нужно, а затем очистить его, вместо того чтобы держать его так. – PCG

+1

О, что обработка ошибок настолько ужасна. Может быть, есть сбои все время, что заставляет задачи стоять в очереди до конца, и вы никогда не узнаете, потому что вы подавляете все ошибки. – usr

ответ

3

Конечно, GC не может собирать переменную памяти, связанную с List или некоторой переменной коллекции, в которой вы постоянно сохраняете данные набивки и эта переменная памяти никогда не выходит за пределы ссылки. Поскольку вы используете бесконечный цикл с while (true), обратите внимание на переменную коллекции, которую вы используете в этом цикле. Посмотрите, растет ли оно и увеличивается ли ...

Вы используете EF или какой-нибудь ORM? Если да, проверьте, всегда ли вы добавляете запись в глобальный контекст EF?

+0

Может быть, GC не нужно было собирать память еще ... –

+0

@Peter Ritchie, извините меня за мой плохой английский !!!вы имели в виду, что GC не получил триггера, не так ли? – Sameer

+0

Hi; Спасибо за ваш ответ; Я использую EF, который я определил в верхней части класса следующим образом: ** частный контекст RefahDBEntities **; и что-то подобное в OnConfigurationService: ** context = new RefahDBEntities(); **; Так это моя проблема ?? –

Смежные вопросы