Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

C#. Windows Service. Подтекает память

Подскажите, пожалуйста, в каком месте я допустил ошибку, что служба постепенно поджирает память
Задача службы при старте загружать построчно адреса из файла Services.txt в List и через определенный интервал делать GET-запрос по каждому URL из файла
Program.cs
static class Program { static void Main() { ServiceBase[] ServicesToRun = { new ServicePusher() };
ServiceBase.Run(ServicesToRun); } }
ServicePusher.cs
public partial class ServicePusher : ServiceBase { private static readonly Logger Log = LogManager.GetCurrentClassLogger(); private Timer ServiceTimer; private readonly List ServiceUrl = new List();
public ServicePusher() { InitializeComponent(); }
protected override void OnStart(string[] args) { if (!File.Exists(AppDomain.CurrentDomain.BaseDirectory + "/Services.txt")) { Log.Error("Не найден Services.txt"); throw new FileNotFoundException("Не найден Services.txt"); }
using (StreamReader sr = new StreamReader(AppDomain.CurrentDomain.BaseDirectory + "/Services.txt")) { string line;
while ((line = sr.ReadLine()) != null) { Uri serviceUri = null;
try { serviceUri = new Uri(line); } catch (Exception ex) { Log.Error($"Ошибка при получении адреса сервиса ({line}): {ex}"); }
if (serviceUri != null) { ServiceUrl.Add(serviceUri); } else { Log.Error($"Некорректный адрес сервиса ({line}) в файле Services.txt"); } } }
ServiceTimer = new Timer { Interval = Config.Interval };
ServiceTimer.Elapsed += Tick; ServiceTimer.AutoReset = true; ServiceTimer.Start();
Log.Info("Сервис успешно запущен"); Log.Info($"Загружено сервисов: {ServiceUrl.Count}"); }
protected override void OnStop() { ServiceTimer.Stop(); ServiceTimer.Dispose(); ServiceTimer = null;
Log.Info("Сервис остановлен"); }
private void Tick(object sender, ElapsedEventArgs e) { try { foreach (Uri url in ServiceUrl) { ServicePointManager.ServerCertificateValidationCallback = (o, a, b, c) => true;
WebRequest request = WebRequest.Create(url); request.Proxy = null; request.Method = "GET"; request.Timeout = 360000; request.ContentType = "application/x-www-form-urlencoded";
try { using (WebResponse response = request.GetResponse()) { using (Stream requestStream = response.GetResponseStream()) { if (requestStream == null) { Log.Error($"Нет ответа от {url}"); } } } } catch (Exception ex) { Log.Error($"Ошибка ({ex.Message}) при запросе к сервису {url}"); } } } catch (Exception ex) { Log.Error(ex.Message); } } }
UPD: отжирает примерно по 2 мб в час
UPD 2: обновил код в вопросе, за 15 минут стабильно жрет ~350 кб...
Может дело в Program.cs?


Ответ

В общем мои опасения оказались напрасны, оставил службу работать всю ночь, сейчас работает и использует всего 5 мб памяти
Но остается непонятным почему при запуске службы первое время она потребляет около 11 мб

Комментариев нет:

Отправить комментарий