|
Backgroundworker. Утечка памяти
|
|||
---|---|---|---|
#18+
Есть вот такой класс Код: 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.
По таймеру запускается фоновый процесс. При каждом запуске выделяется некоторое количество памяти, но не высвобождается. Как бы после завершения фонового процесса память за ним почистить? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2013, 10:48 |
|
Backgroundworker. Утечка памяти
|
|||
---|---|---|---|
#18+
egorius, а что таймер так будет дальше тикать? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2013, 11:12 |
|
Backgroundworker. Утечка памяти
|
|||
---|---|---|---|
#18+
Да, таймер тикает пока не надоест :) Идея в том, что через определенный промежуток времени проверяется состояние фонового процесса, и, если он завершен, то он запускается заново. Это будет сервис, который работает 24/7. То есть процесс будет запускаться огромное количество раз. И каждый запуск (даже в таком варианте с пустым методом) добавляет несколько килобайт памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2013, 11:22 |
|
Backgroundworker. Утечка памяти
|
|||
---|---|---|---|
#18+
Так вроде и не должно быть утечки в том коде, что ты привел. Я бы вообще без таймера делал, бэкграунд запускал бы один раз, а проверки на время делал бы в ReadData() ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2013, 11:39 |
|
Backgroundworker. Утечка памяти
|
|||
---|---|---|---|
#18+
Разобрался в чем дело :) Утечки действительно нет, просто винда умная и сама решает высвобождать память после завершения процесса или нет :) Можно ее подтолкнуть к этому с помощью Garbage Collection. Добавил чистку мусора перед запуском процесса и течка остановилась. А по поводу таймеров и проверок.. Я просто очень сокращенный код привел. ReadData может быть весьма продолжительной операцией, которая может длиться дольше, чем период проверки. А таймер работает в лоб: время пришло - метод запустил. А то что этот метод еще с прошлого тика работает ему по барабану. Так что в данном случае фоновый процесс используется как раз для того, чтобы избавиться от кучи параллельных операций :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2013, 11:53 |
|
Backgroundworker. Утечка памяти
|
|||
---|---|---|---|
#18+
egoriusReadData может быть весьма продолжительной операцией, которая может длиться дольше, чем период проверки. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2013, 12:12 |
|
Backgroundworker. Утечка памяти
|
|||
---|---|---|---|
#18+
egorius, System.Threading.Timer как бы лучше System.Windows.Forms.Timer'a. используй его. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2013, 12:20 |
|
Backgroundworker. Утечка памяти
|
|||
---|---|---|---|
#18+
Pallaris, Ну в принципе да, вариант. Только надо sleep, пожалуй еще добавить. Иначе цикл while поест все ресурсы. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2013, 12:26 |
|
Backgroundworker. Утечка памяти
|
|||
---|---|---|---|
#18+
beg-in-er, А в чем преимущество? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2013, 12:27 |
|
Backgroundworker. Утечка памяти
|
|||
---|---|---|---|
#18+
beg-in-er, Почитал. Осознал. Полез разбираться и понял, что использовал System.Timers.Timer а не System.Windows.Forms.Timer, который в свою очередь является просто оберткой для Threading.Timer, но с интерфесом похожим на Forms.Timer ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2013, 12:57 |
|
|
start [/forum/topic.php?fid=20&msg=38245113&tid=1404760]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
92ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 8ms |
total: | 172ms |
0 / 0 |