Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Yourasik
2 / 2 / 6
Регистрация: 31.05.2014
Сообщений: 174
Завершенные тесты: 1
1

Отследить потерю памяти ReportViewer

28.10.2016, 11:01. Просмотров 312. Ответов 14

Помогите отследить потерю оперативной памяти. При каждом запуске отчета она увеличивается на 2-3 мб. Вот как запускаю отчет
C#
1
2
3
4
5
6
7
        private void callLoading()
        {
            using (loadingList f7 = new loadingList())
            {
                f7.ShowDialog();
            }
        }
Код формы в которой открывается отчет
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
using System.Data.SqlClient;
using System.IO;
using System.Security;
using System.Reflection;
 
namespace MSU
{
    public partial class loadingList : Form
    {
        SqlCommand cmd = new SqlCommand();
        public loadingList()
        {
            InitializeComponent();
        }
 
        private void loadingList_Load(object sender, EventArgs e)
        {
            GC.SuppressFinalize(reportViewer1);
 
            using (SqlConnection cn = new SqlConnection(@"строка подключения"))
            {
                cn.Open();
                DandDDataSet r = new DandDDataSet();
                
                SqlDataAdapter da = new SqlDataAdapter("тут запрос", cn);
                da.Fill(r, r.Tables[0].TableName);
 
                ReportDataSource mds = new ReportDataSource("DataSet1", r.Tables[0]);
                this.reportViewer1.LocalReport.DataSources.Clear();
                this.reportViewer1.LocalReport.DataSources.Add(mds);
                this.reportViewer1.LocalReport.Refresh();
                this.reportViewer1.RefreshReport();
            }
        }
 
        private void loadingList_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.reportViewer1.Reset();
            this.reportViewer1.Dispose();
            GC.SuppressFinalize(reportViewer1);
        }
    }
}
Уже пробовал этот способ ссылка но или я не знаю как правильно прилепить или он мне не помог. После запуска отчета занимается память, а после закрытия формы не высвобождается. Надеюсь на ваши ответы.

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

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2016, 11:01
Ответы с готовыми решениями:

Ошибки в reportViewer
На основе представления в БД SQL Server в конструкторе было создано...

Использование ReportViewer
Уважаемое эксперты помогите разобратцся reportViewer. Я сваи Wind form добавил...

Работа с ReportViewer
Здравствуйте! Подскажите пожалуйста как работать с ReportViewer... в интернете...

Использование ReportViewer
Вопрос такой пытаюсь разобраться в отчетах report для c#. Общий принцип я...

Создание отчета в reportViewer
Уважаемые программисты, владеющие языком C#! Делаю отчет в reportViewer. В...

14
Usaga
Эксперт .NET
5126 / 3485 / 614
Регистрация: 21.01.2016
Сообщений: 13,811
Завершенные тесты: 2
28.10.2016, 11:33 2
C#
1
GC.SuppressFinalize(reportViewer1);
Это что такое? Чтобы репортер не удалялся, а оставался в памяти занимая 2-3 Мб?

Добавлено через 1 минуту
Кстати, если "замеры" памяти производились с помощью Task Manager, то доверять этим результатам нельзя.

Добавлено через 7 минут
Ещё хочу заметить, что сборщик мусора - не скорая помощь, он не летит "на крыльях ночи" убирать за тобой сразу же после закрытия формы. Он будет убирать тогда, когда посчитает нужным, поэтому между циклами открытия\закрытия форм может накопиться очередь "неубранного". Но это если закрытие формы не останавливает твою программу. Если форма единственная и программа останавливается, то система сразу же высвободит все занятые ресурсы. А то, что там Task Manager показывает - пофигу
0
Yourasik
2 / 2 / 6
Регистрация: 31.05.2014
Сообщений: 174
Завершенные тесты: 1
28.10.2016, 14:20  [ТС] 3
Usaga,
C#
1
GC.SuppressFinalize(reportViewer1);
это я методом тыка проверял. тестил пожирание в ProcessExplorer. Нет нет, мне нужно что бы он закрылся после закрытия формы.
0
Usaga
Эксперт .NET
5126 / 3485 / 614
Регистрация: 21.01.2016
Сообщений: 13,811
Завершенные тесты: 2
28.10.2016, 14:37 4
Yourasik, могу посоветовать такой вот способ, чтобы убедиться, что это не утечки памяти: проведи серию открытий\закрытий твоей формы (раз так 100, в цикле, а не руками, конечно) и посмотри на динамику "пожирания" памяти. По-хорошему, "пожирание" должно перестать расти раза так с пятого-десятого...

Добавлено через 4 минуты
Посмотреть на что тратиться память (не очень удобным образом, но всё же) можно с помощью такой вот фиговины: CLR profiler. Погугли как ей пользоваться, она не сложная.

Есть и другие, куда более серьёзные вещи, но тебе и этого хватит. Оно всяко лучше Task Manager-а.
0
Yourasik
2 / 2 / 6
Регистрация: 31.05.2014
Сообщений: 174
Завершенные тесты: 1
31.10.2016, 16:11  [ТС] 5
Usaga, вообще нифига понять не могу в CLR profiler, картинка меняется увлечений памяти нигде не вижу
0
Usaga
Эксперт .NET
5126 / 3485 / 614
Регистрация: 21.01.2016
Сообщений: 13,811
Завершенные тесты: 2
31.10.2016, 17:26 6
Цитата Сообщение от Yourasik Посмотреть сообщение
картинка меняется увлечений памяти нигде не вижу
Значит утечек нет.
1
Yourasik
2 / 2 / 6
Регистрация: 31.05.2014
Сообщений: 174
Завершенные тесты: 1
31.10.2016, 18:32  [ТС] 7
Usaga, там конечно ппц если честно, мне почему то кажется что я не там смотрю. А если я выгружу два лога до и после генерации отчета, вы не гляните?
0
Usaga
Эксперт .NET
5126 / 3485 / 614
Регистрация: 21.01.2016
Сообщений: 13,811
Завершенные тесты: 2
31.10.2016, 18:59 8
Yourasik, в этом нет необходимости (как и у меня желания ).

Как были сделаны выводы о утечке памяти? Смотрел на показания Task Manager-а до и после работы приложения? Если так, то "неуменьшение" количества занятой памяти не показатель утечек. Просто система не спешить сбрасывать разного рода кэши и выгружать какие-то загруженные ранее вещи. Твоё приложение, какое бы кривое оно не было, не сможет после своего закрытия оставить какую-то память "утекшей". Такое только под WIN98 последний раз встречалось, да и то не часто.
1
Yourasik
2 / 2 / 6
Регистрация: 31.05.2014
Сообщений: 174
Завершенные тесты: 1
01.11.2016, 11:27  [ТС] 9
Usaga, после закрытия приложения проблем нет. Есть проблемы при запуске rdlc отчетов в приложении, при каждом запуске пожирается 2-3мб и не высвобождается, с программой работают круглосуточно, с 21 00 до 09 00 отчет запускают примерно 160 раз, за этот период в диспетчере задач оператива приложения дошла до 400мб, опять же показатель смотрел в диспетчере задач конечного пользователя. При запуске программы, она занимает 21мб и если не пользоваться отчетами более 30мб она не поднимается. Отказаться от отчетов нет возможности, так как при помощи их печатаются документы в рейс водителю.
0
Usaga
Эксперт .NET
5126 / 3485 / 614
Регистрация: 21.01.2016
Сообщений: 13,811
Завершенные тесты: 2
01.11.2016, 11:36 10
Yourasik, значит в приложении есть утечки памяти. Нужно профилировать. Не факт, что утечка вызвана именно построителем отчётов. Проблема может быть и с формой в которой он отображается. Как форма закрывается? Может какой-то код подписывается на события этой формы и она остаётся висеть в памяти? Вариантов много.

Добавлено через 2 минуты
Объекты будут оставаться "живыми" пока на них имеется ссылка. Если объект "толстозадый" и и бажный код прогоняется в цикле, то память будет заметно отжираться.
1
Yourasik
2 / 2 / 6
Регистрация: 31.05.2014
Сообщений: 174
Завершенные тесты: 1
01.11.2016, 17:37  [ТС] 11
Usaga, я комментировал отчет и вызывал форму, то оперативная память не изменялась, она так же растет если не вызывать форму заново, а просто рефрешить отчет.
0
Usaga
Эксперт .NET
5126 / 3485 / 614
Регистрация: 21.01.2016
Сообщений: 13,811
Завершенные тесты: 2
01.11.2016, 17:52 12
Yourasik, можешь сделать минимальный, кастрированный вариант проекта, с тестовыми данными, который демонстрирует такое поведение и выложить на форум?
1
Yourasik
2 / 2 / 6
Регистрация: 31.05.2014
Сообщений: 174
Завершенные тесты: 1
01.11.2016, 19:09  [ТС] 13
Usaga, сделал, все обьекты, которые создаются обнял в using и на метод loadingList_FormClosing повесил
C#
1
2
3
4
     this.reportViewer1.Reset();
     this.reportViewer1.Dispose();
     GC.SuppressFinalize(reportViewer1);
     GC.Collect();
Вроде чистит после закрытия формы. Спасибо Вам большое что откликнулись.
0
Usaga
Эксперт .NET
5126 / 3485 / 614
Регистрация: 21.01.2016
Сообщений: 13,811
Завершенные тесты: 2
01.11.2016, 19:18 14

Не по теме:

Да я собственно, ничего и не сделал :)



Приведи фрагмент полученного кода, чтобы последующим поколениям было понятно, что было сделано.
0
Yourasik
2 / 2 / 6
Регистрация: 31.05.2014
Сообщений: 174
Завершенные тесты: 1
02.11.2016, 12:04  [ТС] 15
Usaga, Вот полный код отчета
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
        private void loadingList_Load(object sender, EventArgs e)
        {
            using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
            {
                cn.Open();
                using (DandDDataSet r = new DandDDataSet())
                {
                    using (SqlDataAdapter da = new SqlDataAdapter("тут запрос", cn))
                    {
                        da.Fill(r, r.Tables[0].TableName);
 
                        ReportDataSource mds = new ReportDataSource("DataSet1", r.Tables[0]);
                        this.reportViewer1.LocalReport.DataSources.Clear();
                        this.reportViewer1.LocalReport.DataSources.Add(mds);
                        this.reportViewer1.LocalReport.Refresh();
                        this.reportViewer1.RefreshReport();
                    }
                }
            }
        }
 
        private void loadingList_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.reportViewer1.Reset();
            this.reportViewer1.Dispose();
            GC.SuppressFinalize(reportViewer1);
            GC.Collect();
        }
0
02.11.2016, 12:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2016, 12:04

Не работает ReportViewer на Win 8
Здравствуйте. Не могу запустить форму с ReportViewer на Windows 8. На 7ке всё...

ReportViewer -лог файл
Суть задачи: необходимо логировать печать из ReportViewer. Не знаю как...

Выравнивание текста в Reportviewer
Здравствуйте. Создаю отчет с помощью reportviewer. Не могу найти выравнивание...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru