Падение производительности при многократных вызовах Report.show()

отредактировано 07:18 Раздел: FastReport .NET
У меня есть грид. При смене выделенной строки по ней строится отчет и отображается в 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();

Комментарии

  • отредактировано 07:18
    Мне нужен пример, демонстрирующий проблему. В демке используется похожий механизм построения отчета, но падения производительности я не наблюдаю.
  • отредактировано 07:18
    Падение производительности происходит в моем приложении по следующим причинам:

    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

    в демке падения производительности не происходит так как там всё время регистрируется один и тот же объект
  • отредактировано 07:18
    помогает при каждом щелчке по строке грида инстанцировать uc_report, но хочестся всё-таки использовать uc_report повторно, как в демке
  • отредактировано 07:18
    Здравствуйте,

    Повторно использовать экземпляр Report в таком случае не рекомендуется. Ранее зарегистрированные данные при report.Clear() физически не удаляются, и при повторной регистрации идет сравнение св-в.
  • отредактировано 07:18
    Можно поподробней про сравнение свойств?
    И почему нельзя при report.Clear() физически удалять данные из отчета? IMHO это ожидаемое поведение.

    Возможно повторное использование объекта report увеличит производительность,
    хотя возможно реинстанцирование report

    report.Dispose();
    report = new Report();
    \\ установка свойств report

    будет работать быстрее, чем очистка состояния
    report.Clear();

    У реистанцирования есть недостаток:
    код инициализации report свойств придется поместить в код формы, который будет дублировать код дизайнера или придётся отказаться от услуг дизайнера



  • отредактировано 07:18
    report.Clear полностью не очищает ранее зарегистрированные данные. Это сделано специально для поддержки дизайнера.
  • отредактировано 07:18
    Можно в метод report.RegisterData(...) передавать булевый параметр, который указывает регистрируются данные для дизайнера.
    Если нет, то отключить лишние механизмы, необходимые для поддержки дизайнера и при Clear() эти данные удалять.

    Или в Clear добавить булевый параметр: удалять ли зарегистрированные датасоурсы.

  • отредактировано 07:18
    Попробуйте
    report.Dictionary.UnregisterData(объект, имя)
    надо передать тот же самый объект, который передавали при регистрации. В следующем билде сделаю доступным метод report.Dictionary.ClearRegisteredData

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.