Страница 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:
Данная опция указывает на то, что для всех пользователей будет использован единый кэш отчета. По умолчанию опция установлена в значение 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 отчёта + хэш значений параметров отчёта (если они присутствуют).
Спасибо.