Падение производительности при многократных вызовах Report.show()
У меня есть грид. При смене выделенной строки по ней строится отчет и отображается в PreviewControl. Первое отображение отчета происходит за ~500 мс. Потом ~300 мс. Далее каждое новое построение отчета занимает больше времени, чем предыдущее. Если построить отчет раз 20 (то есть 20 раз поменять выделенную строку грида), то дальнейшие построения будут занимать ~700 мс. Похоже не освобождаются какие-то ресурсы.
Дополнительная информация:
Код выполняющийся при смене строки грида:
uc_Report.Load(fileFullName);
uc_Report.RegisterData(new List<object> { entity }, "{0}_DataSource".FormatWith(entity.GetType().Name));
uc_Report.Show();
Дополнительная информация:
Код выполняющийся при смене строки грида:
uc_Report.Load(fileFullName);
uc_Report.RegisterData(new List<object> { entity }, "{0}_DataSource".FormatWith(entity.GetType().Name));
uc_Report.Show();
Комментарии
1) при выполнении
uc_Report.RegisterData(new List<object> { entity }, "{0}_DataSource".FormatWith(entity.GetType().Name));
entity каждый раз разный (если щелкать по разным строкам грида)
2) при выполнении
uc_Report.Load(fileFullName);
зачем-то опрашиваются все свойства ВСЕХ entity, для которых ранее выполнялось:
uc_Report.RegisterData(new List<object> { entity }, "{0}_DataSource".FormatWith(entity.GetType().Name));
uc_Report.Clear() не помогает
хотелось бы иметь что-то вроде uc_Report.UnRegisterData
в демке падения производительности не происходит так как там всё время регистрируется один и тот же объект
Повторно использовать экземпляр Report в таком случае не рекомендуется. Ранее зарегистрированные данные при report.Clear() физически не удаляются, и при повторной регистрации идет сравнение св-в.
И почему нельзя при report.Clear() физически удалять данные из отчета? IMHO это ожидаемое поведение.
Возможно повторное использование объекта report увеличит производительность,
хотя возможно реинстанцирование report
report.Dispose();
report = new Report();
\\ установка свойств report
будет работать быстрее, чем очистка состояния
report.Clear();
У реистанцирования есть недостаток:
код инициализации report свойств придется поместить в код формы, который будет дублировать код дизайнера или придётся отказаться от услуг дизайнера
Если нет, то отключить лишние механизмы, необходимые для поддержки дизайнера и при Clear() эти данные удалять.
Или в Clear добавить булевый параметр: удалять ли зарегистрированные датасоурсы.
report.Dictionary.UnregisterData(объект, имя)
надо передать тот же самый объект, который передавали при регистрации. В следующем билде сделаю доступным метод report.Dictionary.ClearRegisteredData