Страница 1 из 1

Многопоточность и Dispose()

Добавлено: 23 апр 2015, 10:26
DmitryRu
Хотелось бы уточнить, является ли результат вызова метода

Код: Выделить всё

StiReport.GetReportFromAssembly ("MyReport.Dll", true)
потокобезопасным?
Например, мне надо поменять TimeOut для DataSource - для разных случаев у меня могут быть разные тайм-ауты.
Другими словами, вызов этого метода, GetReportFromAssembly, возвращает все время один и тот же объект, или каждый вызов возвращает новый объект?

Далее, надо ли мне вызывать Dispose() для данного объекта? Компилятор настаивает, что надо.
Речь идет о примерно таком коде:

Код: Выделить всё

        public ActionResult GetReportSnapshot()
        {
            var mrt = StiReport.GetReportFromAssembly ("MyReport.Dll", true);
            return StiMvcViewer.GetReportSnapshotResult(HttpContext, mrt);
        }
Компилятор подсказывает, что перед выходом из данного метода, надо бы вызвать Dispose(), но не повлияет ли это на какое-нибудь кэширование в Ваших библиотеках?

Re: Многопоточность и Dispose()

Добавлено: 23 апр 2015, 15:51
HighAley
Здравствуйте.

При использовании метода GetReportFromAssembly() сборка отчёта загружается в память и создаётся новый объект. При повторном вызове того же метода создастся ещё один объект.
Для каждого отчёта можно вызывать метод Dispose().
Из-за особенностей .Net Framework, сборка будет выгружена из памяти только вместе с AppDomain.

Спасибо.

Re: Многопоточность и Dispose()

Добавлено: 24 апр 2015, 11:58
DmitryRu
Для каждого отчёта можно вызывать метод Dispose().
Хотелось бы уточнить, не будет ли это препятствовать кэшированию результатов вычисления данных для отчета,
если правильно понимаю, кэшированием я могу управлять с помощью св-ва StiMvcViewer'а

Код: Выделить всё

Serverю.CacheMode = StiServerCacheMode.ObjectSession

Re: Многопоточность и Dispose()

Добавлено: 24 апр 2015, 17:57
Vladimir
Здравствуйте Дмитрий,

При использовании StiServerCacheMode.ObjectSession, в сессию сохраняется переданный объект отчета, для этого используется метод Session.Add(cacheGuid, report).
Следовательно, утилизация этого объекта может привести к некорректной работе MVC Viewer.

Спасибо.

Re: Многопоточность и Dispose()

Добавлено: 29 апр 2015, 13:31
DmitryRu
Aleksey Andreyanov писал(а): Для каждого отчёта можно вызывать метод Dispose().
Vladimir писал(а):Следовательно, утилизация этого объекта может привести к некорректной работе MVC Viewer.
Все-таки хотелось бы понять, когда в случае MVC Viewer можно вызывать Dispose(), а когда нет.

Вот здесь например, рекомендуют использовать Dispose():
http://forumru.stimulsoft.com/viewtopic ... 535#p14531

Видимо, правило таково, что если применяешь кэширование отчета, то Dispose() вызывать нельзя?
Кэшированием я управляю через свойство Server.CacheMode?
Не будут ли Ваши библиотеки сами, по тихой, кэшировать построенный отчет?
И можно ли потом все-таки освободить память, когда отчет уже точно не нужен?

Re: Многопоточность и Dispose()

Добавлено: 30 апр 2015, 10:56
Vladimir
Здравствуйте Дмитрий,

Объект построенного отчёта сохранится в кэше сервера только один раз, затем от постоянно используется внутри вьювера для любых действий (листание страниц, изменение масштаба, экспортирование и т.п.), поэтому лучше не утилизировать объект отчёта, это может привести к некорректной работе MVC Viewer.
И можно ли потом все-таки освободить память, когда отчет уже точно не нужен?
Если отчет не используется больше, чем определенное время (по умолчанию 20 минут), то объект отчета удаляется из кэша сервера и соответственно память освобождается.

Спасибо.

Re: Многопоточность и Dispose()

Добавлено: 07 июл 2015, 20:39
DmitryRu
Aleksey Andreyanov писал(а):При использовании метода GetReportFromAssembly() сборка отчёта загружается в память и создаётся новый объект. При повторном вызове того же метода создастся ещё один объект.
Вычитал вот здесь
http://forumru.stimulsoft.com/viewtopic.php?f=8&t=4221
вот такое:
Vladimir писал(а):Вам должна помочь указанная ниже опция компонента StiMvcViewer:

Код: Выделить всё

       Server =
       {
            GlobalReportCache = false
       }
Данная опция указывает на то, что для всех пользователей будет использован единый кэш отчета. По умолчанию опция установлена в значение true.
Хотел бы уточнить, получается, что по умолчанию, объекты, создаваемые из GetReportFromAssembly() НЕ потокобезопасны?
Только при установки опции GlobalReportCache = false они будут потокобезопасны?

Re: Многопоточность и Dispose()

Добавлено: 08 июл 2015, 09:29
Vladimir
Здравствуйте Дмитрий,

Построенный отчет хранится в кэше сервера (HttpContext.Cache).
Судя документации:
https://msdn.microsoft.com/ru-ru/librar ... 90%29.aspx
этот класс является потокобезопасным.

Указанная опция влияет только на идентификатор отчета, хранящегося в кэше. При установке в false, к идентификатору добавляется уникальный идентификатор клиента. Это позволяет хранить в кэше один и тот же построенный отчет с разными наборами данных или параметрами отчета, присваиваемыми из кода на стороне сервера.

Спасибо.

Re: Многопоточность и Dispose()

Добавлено: 08 июл 2015, 10:40
DmitryRu
А если GlobalReportCache = true, что является идентификатором отчета в кэше?

Re: Многопоточность и Dispose()

Добавлено: 08 июл 2015, 15:04
Vladimir
Идентификатором кэша является Id вьювера + Guid отчёта + хэш значений параметров отчёта (если они присутствуют).

Спасибо.