Я делаю службу 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 гигабайт оперативной памяти?
Заранее спасибо
Редактировать ===========
Я забыл рассказать вам, что я никогда не выключайте компьютер.
Похож на проблему с сборкой мусора. Возможно, вы прикрепляете обработчики событий, которые не выпущены должным образом, или вы держите ссылки на некоторые объекты, чтобы они не собирались. Вы должны рассмотреть возможность выполнения профилирования, чтобы увидеть, что занимает память. – ChrisK
Нужно ли всегда иметь SoapServiceClient? Я бы предложил создать его, когда вам это нужно, а затем очистить его, вместо того чтобы держать его так. – PCG
О, что обработка ошибок настолько ужасна. Может быть, есть сбои все время, что заставляет задачи стоять в очереди до конца, и вы никогда не узнаете, потому что вы подавляете все ошибки. – usr