Как правильно высвободить ресурсы после просмотра отчета?
Здравствуйте!
Подскажите как правильно высвободить ресурсы после показа отчета?
Пример
Report rpt = new Report();
rpt.Load("Report.frx");
rpt.Show(false); // - тут false, для того, чтобы не ждать "ручного" закрытия окна превью.
и вот тут теперь вопрос как быть?
rpt.Dispose()? - не то
Т.е. как закрыть превью окно и уничтожить объект rpt?
После этого, программа продолжает работать дальше и объект класса Report будет создан заново.
Суть данной задумки в том, чтобы показывать определенные отчеты через определнные интервалы времени полностью в автоматическом режиме длительное время.
Подскажите как правильно высвободить ресурсы после показа отчета?
Пример
Report rpt = new Report();
rpt.Load("Report.frx");
rpt.Show(false); // - тут false, для того, чтобы не ждать "ручного" закрытия окна превью.
и вот тут теперь вопрос как быть?
rpt.Dispose()? - не то
Т.е. как закрыть превью окно и уничтожить объект rpt?
После этого, программа продолжает работать дальше и объект класса Report будет создан заново.
Суть данной задумки в том, чтобы показывать определенные отчеты через определнные интервалы времени полностью в автоматическом режиме длительное время.
Комментарии
Попробуйте так:
rpt.Preview.FindForm().Close();
rpt.Dispose();
Вот так, форма закрывается, нопамять все равно идет вверх.
А вот если вот так:
rpt.Preview.FindForm().Close();
rpt.Dispose();
rpt = null
GC.Collect();
Тогда нормально получается.
Теперь немного другая ситуация.
А как сделать чтоб сама форма Preview оставалась всегда открытой, но в неё подгружались разные отчеты?
Пробовал так: (код не рабочий, просто пример направления мысли)
class program
{
private Report rpt = new Report()
System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();
private void Form1_Load(object sender, EventArgs e)
{
tmr.Interval = 10000;
tmr.Tick += new EventHandler(tmr_Tick);
tmr.Start();
}
void tmr_Tick(object sender, EventArgs e)
{
tmr.Stop();
//тут делам показ разных отчетов. в данном примере пока 1
rep.Load("report.frx");
//пробовал вместо rep.Load использовать rep.Preview.Load();, но там какой то формат файла должен быть другой...
rep.Show(rep.Preview.FindForm()); // вот на этом этапе каждые 10 сек (работа таймера) происходит захват памяти.
tmr.Start();
}
}
как сделать так, чтобы и отчет отобразился в этом же Preview окне и окно не закрывалось и русурсы не тратились?
Ресурсы освободятся после отработки GC.
Тут вот в чем проблема.
Как бы немного не стандартное использование отчетности.
По сути, Preview с кучей подгружаемых отчетов по времени это есть слайды. В этом ключе и предполагается использовать FastReport.
Но проблема в том, что GC.Collect вызывать нельзя для rep. Так как он будет работать постоянно.... сутками, подгружая в Preview разнгые отчеты и отображая их по циклу.
Вот. Так что как то в rep.Show(false) надо придумать без захвата памяти ещё. Так как сейчас при каждом подгружении отчета захватывается память..следвоательно минут 15 поработало все это и памяти нет (с 10 секундным интервалом показа).
http://www.fast-report.com/en/forum/index.php?showtopic=6727
Не понятно почему.
Другой способ избежать компиляции отчета (и расхода памяти) - сохранить отчет в виде файла .cs и добавить его в проект. В дизайнере отчета выберите пункт "Файл|Сохранить как...", и выберите тип файла - "Файл C#" или "Файл VB.Net" (это зависит от того, какой язык выбран в самом отчете). С отчетом работать можно так:
SimpleListReport report = new SimpleListReport();
report.RegisterData(...);
report.Show();
Если бы возможно было отдельно выводить окно Preveiw, в нем уже просто показывать разные отчеты, тогда было бы проще, но судя по всему реализовать такое не представляется возможным в текущем коде FR?
Возможно ли пойти другим путем? Ну скажем делается 1 отчет, на разных листах которого располагается нужные отчетные данные.
И по таймеру этот отчет листается по циклу?
Но! Тут необходимо как то так сделать, чтобы в момент когда открывается последующий лист, данные подгружались заново, т.е. чтобы при изменении данных в базе, данные в отчете так же бы менялись. Сейчас работа с БД идет на стадии формирования отчета перед показом как я понял. А возможно ли ещё как то сделать запрос при перелистывании?
Делается 1 файл с кучей отчетных листов и листы меняются по таймеру 1, а по таймеру 2 отчет перегружается (т.о. данные обновляются), и вот так как бы все работает нормально и память не расходуется.