Ошибка при параллельном построении отчетов

Обсуждение Stimulsoft Reports.NET
Ответить
Ингвар
Сообщения: 159
Зарегистрирован: 17 июл 2012, 19:27

Ошибка при параллельном построении отчетов

Сообщение Ингвар »

На версии 2023.1.2 при одновременном построении нескольких отчетов периодически вылетает ошибка:

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

System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
   at System.Collections.Generic.Dictionary`2.FindValue(TKey key)
   at Stimulsoft.Drawing.FontFamily.CreateSixFont(Single sizeInPoints, FontStyle style)
   at Stimulsoft.Drawing.Font..ctor(FontFamily family, Single emSize, FontStyle style, GraphicsUnit unit, Byte gdiCharSet, Boolean gdiVerticalFont)
Проблема при изменении Dictionary из разных потоков. Просьба сделать функцию CreateSixFont потокобезопасной.
Aleksey
Сообщения: 2761
Зарегистрирован: 22 апр 2010, 06:57

Re: Ошибка при параллельном построении отчетов

Сообщение Aleksey »

Здравствуйте,

Необходимо время для анализа.

Спасибо.
Aleksey
Сообщения: 2761
Зарегистрирован: 22 апр 2010, 06:57

Re: Ошибка при параллельном построении отчетов

Сообщение Aleksey »

Здравствуйте,

Вышлите простой пример проекта. Не получается воспроизвести, возможно что-то не учитываем.

Спасибо.
Ингвар
Сообщения: 159
Зарегистрирован: 17 июл 2012, 19:27

Re: Ошибка при параллельном построении отчетов

Сообщение Ингвар »

Я ведь указал на конкретную проблему в исходном коде. В функции CreateSixFont используется static Dictionary, который может меняться из разных потоков, что приводит к ошибке. Самое простое решение - добавить lock. Вот полный стек вызовов:

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

System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
   at System.Collections.Generic.Dictionary`2.FindValue(TKey key)
   at Stimulsoft.Drawing.FontFamily.CreateSixFont(Single sizeInPoints, FontStyle style)
   at Stimulsoft.Drawing.Font..ctor(FontFamily family, Single emSize, FontStyle style, GraphicsUnit unit, Byte gdiCharSet, Boolean gdiVerticalFont)
   at Stimulsoft.Report.Chart.StiChartTitle..ctor()
   at Stimulsoft.Report.Chart.StiChart..ctor(RectangleD rect)
   at Stimulsoft.Report.Chart.StiChart..ctor()
   at Stimulsoft.Report.Chart.StiChart.CreateNew()
   at Stimulsoft.Report.Components.StiComponentsCollection.LoadFromJsonObject(JObject jObject)
   at Stimulsoft.Report.Components.StiContainer.LoadFromJsonObject(JObject jObject)
   at Stimulsoft.Report.Components.StiPanel.LoadFromJsonObject(JObject jObject)
   at Stimulsoft.Report.Components.StiPage.LoadFromJsonObject(JObject jObject)
   at Stimulsoft.Report.Components.StiPagesCollection.LoadFromJsonObjectInternal(JObject propJObject)
   at Stimulsoft.Report.Components.StiPagesCollection.LoadFromJsonObject(JObject jObject)
   at Stimulsoft.Report.StiReport.LoadFromJsonInternal(Stream stream)
   at Stimulsoft.Report.SaveLoad.StiJsonReportSLService.Load(StiReport report, Stream stream)
   at Stimulsoft.Report.StiReport.Load(StiReportSLService service, Stream stream)
   at Stimulsoft.Report.StiReport.Load(Stream stream)
   at Stimulsoft.Report.StiReport.Load(String path)
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Re: Ошибка при параллельном построении отчетов

Сообщение Ivan »

Здравствуйте.
Я ведь указал на конкретную проблему в исходном коде. В функции CreateSixFont используется static Dictionary, который может меняться из разных потоков, что приводит к ошибке. Самое простое решение - добавить lock.
Данная доработка уже сделана, будет включена в следующий билд.
Однако мы не можем воспроизвести исходную проблему, поэтому не можем гарантировать, что проблема полностью решена.
Как показывает практика, на проектах пользователей иногда проявляются очень неожиданные нюансы.
Поэтому для тестирования желательно присылать тестовые проекты, на которых можно гарантированно воспроизвести проблему и убедиться в правильности её решения.

Спасибо.
Ингвар
Сообщения: 159
Зарегистрирован: 17 июл 2012, 19:27

Re: Ошибка при параллельном построении отчетов

Сообщение Ингвар »

Спасибо за исправление! Пример с отчетом к сожалению прислать не могу, но если будет что-то подобное проявляться на новой версии, то напишу.
Aleksey
Сообщения: 2761
Зарегистрирован: 22 апр 2010, 06:57

Re: Ошибка при параллельном построении отчетов

Сообщение Aleksey »

Здравствуйте,

Пожалуйста.
Ответить