powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Backgroundworker. Утечка памяти
11 сообщений из 11, страница 1 из 1
Backgroundworker. Утечка памяти
    #38244945
egorius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть вот такой класс
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
class Transmitter
    {
        private Timer TimeChecker;
        private BackgroundWorker worker;
        public Transmitter()
        {
            TimeChecker = new Timer();
            TimeChecker.Interval = 1000;
            TimeChecker.Elapsed += new ElapsedEventHandler(RunBackground);
            worker = new BackgroundWorker();
            worker.DoWork +=ReadData;
        }
        private void RunBackground( object source, ElapsedEventArgs e )
        {
            if (worker.IsBusy)
                return;
            else
            {
                worker.RunWorkerAsync();
            }
      
        }
        private void ReadData(object sender, DoWorkEventArgs e)
        {
            return;
        }
        public void RunTimer()
        {
            TimeChecker.Start();
        }
    }


По таймеру запускается фоновый процесс. При каждом запуске выделяется некоторое количество памяти, но не высвобождается. Как бы после завершения фонового процесса память за ним почистить?
...
Рейтинг: 0 / 0
Backgroundworker. Утечка памяти
    #38244985
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorius,

а что таймер так будет дальше тикать?
...
Рейтинг: 0 / 0
Backgroundworker. Утечка памяти
    #38244997
egorius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, таймер тикает пока не надоест :)
Идея в том, что через определенный промежуток времени проверяется состояние фонового процесса, и, если он завершен, то он запускается заново. Это будет сервис, который работает 24/7. То есть процесс будет запускаться огромное количество раз. И каждый запуск (даже в таком варианте с пустым методом) добавляет несколько килобайт памяти.
...
Рейтинг: 0 / 0
Backgroundworker. Утечка памяти
    #38245044
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вроде и не должно быть утечки в том коде, что ты привел.

Я бы вообще без таймера делал, бэкграунд запускал бы один раз, а проверки на время делал бы в ReadData()
...
Рейтинг: 0 / 0
Backgroundworker. Утечка памяти
    #38245066
egorius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался в чем дело :) Утечки действительно нет, просто винда умная и сама решает высвобождать память после завершения процесса или нет :) Можно ее подтолкнуть к этому с помощью Garbage Collection. Добавил чистку мусора перед запуском процесса и течка остановилась.
А по поводу таймеров и проверок.. Я просто очень сокращенный код привел. ReadData может быть весьма продолжительной операцией, которая может длиться дольше, чем период проверки. А таймер работает в лоб: время пришло - метод запустил. А то что этот метод еще с прошлого тика работает ему по барабану. Так что в данном случае фоновый процесс используется как раз для того, чтобы избавиться от кучи параллельных операций :)
...
Рейтинг: 0 / 0
Backgroundworker. Утечка памяти
    #38245087
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egoriusReadData может быть весьма продолжительной операцией, которая может длиться дольше, чем период проверки.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DateTime lastDone_ = DateTime.MinValue;

public void UpdateSystem(object sender, DoWorkEventArgs e)
        {
            while (!IsDisposed && mainThread.CancellationPending == false)
            {
                 TimeSpan dt_ = DateTime.Now - lastDone_;
                 if (dt_.TotalMilliseconds > 1000)
                 {           
                     ReadData();
                     lastDone_ = DateTime.Now;
                 }
                 
                        
            }
        }
...
Рейтинг: 0 / 0
Backgroundworker. Утечка памяти
    #38245105
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorius,

System.Threading.Timer как бы лучше System.Windows.Forms.Timer'a. используй его.
...
Рейтинг: 0 / 0
Backgroundworker. Утечка памяти
    #38245111
egorius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris,

Ну в принципе да, вариант. Только надо sleep, пожалуй еще добавить. Иначе цикл while поест все ресурсы.
...
Рейтинг: 0 / 0
Backgroundworker. Утечка памяти
    #38245113
egorius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
beg-in-er,

А в чем преимущество?
...
Рейтинг: 0 / 0
Backgroundworker. Утечка памяти
    #38245154
egorius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
beg-in-er,

Почитал. Осознал.
Полез разбираться и понял, что использовал System.Timers.Timer а не System.Windows.Forms.Timer, который в свою очередь является просто оберткой для Threading.Timer, но с интерфесом похожим на Forms.Timer
...
Рейтинг: 0 / 0
Backgroundworker. Утечка памяти
    #38245359
Фотография _=ДОБРЫНЯ=_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-eregorius,

System.Threading.Timer как бы лучше System.Windows.Forms.Timer'a. используй его.
+1
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Backgroundworker. Утечка памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]