Потоковая защищенность StiReport

Обсуждение Stimulsoft Reports.NET
Ответить
ask
Сообщения: 50
Зарегистрирован: 21 ноя 2007, 11:02
Откуда: Kazan

Потоковая защищенность StiReport

Сообщение ask »

Пытаюсь использовать обьект StiReport в различных потоках, а именно при печати. Можно ли это делать, документации что то не нашел у вас на эту тему.
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Потоковая защищенность StiReport

Сообщение Vital »

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

Никаких проблем с формированием, экспортом или печатью отчетов в разных потоках быть не должно. Если будут какие то проблемы пишите, будем исправлять.

Спасибо.
NSG
Сообщения: 41
Зарегистрирован: 31 янв 2007, 13:22
Откуда: Russia

Потоковая защищенность StiReport

Сообщение NSG »

Добрый день!
Разрешите немного Вам помочь. На самом деле, проблема, действительно, есть. Сваязана она со статической переменной StiReport.measureGraphics.
При одновременном обращении к ней из разных потоков все падает. Можно решить довольно просто, заменив ее на свойство, чтобы возращать свой Graphics для каждого потока. В связи с этим, из конструктора StiReport убираем инициализацию StiReport.measureGraphics.
Вместо StiReport.measureGraphics вставляем следующий код:

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

//NsgSoft
        //Graphics нужно создавать по потокам, иначе получаем Exception
        internal static Dictionary measureGraphicsArray = new Dictionary();
        private static Graphics measureGraphics
        {
            get
            {
                int threadID = System.Threading.Thread.CurrentThread.ManagedThreadId;
                if (measureGraphicsArray.ContainsKey(threadID))
                {
                    return measureGraphicsArray[threadID];
                }
                else 
                {
                    Graphics mG = null;
                    if (StiOptions.Engine.OldWYSIWYG)
                    {
                        Graphics mG = Graphics.FromImage(new Bitmap(1, 1));
                        mG.PageUnit = GraphicsUnit.Inch;
                        mG.PageScale = .01f;
                    }
                    else
                    {
                        mG = Graphics.FromImage(new Bitmap(1, 1));
                        mG.PageUnit = GraphicsUnit.Pixel;
                        mG.PageScale = 1f;
                    }
                    measureGraphicsArray[threadID] = mG;
                    return mG;
                }
            }
        }
ask
Сообщения: 50
Зарегистрирован: 21 ноя 2007, 11:02
Откуда: Kazan

Потоковая защищенность StiReport

Сообщение ask »

Я использую 2007.3. Правку надо делать в статическом конструкторе StiReport?
NSG
Сообщения: 41
Зарегистрирован: 31 янв 2007, 13:22
Откуда: Russia

Потоковая защищенность StiReport

Сообщение NSG »

Да, у нас тоже используется эта версия. Корректировку надо сделать в классе StiReport.
Есть тут небольшое допущение, что Вы все время будете использовать одни и те же потоки, иначе надо предусмотреть освобождение уже неиспльзованных ресурсов в measureGraphicsArray, например по завершению потоков.
Или подождите, какой вариант предложат авторы.
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Потоковая защищенность StiReport

Сообщение Ivan »

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

В версии 2008.2 в майских предрелизных билдах произведены некоторые изменения, касающиеся MeasureGraphics при многопоточной работе. На всех наших примерах проблем более не наблюдалось. Если Вы найдете еще какие-нибудь нюансы работы - пишите, будем исправлять.

Спасибо.
ask
Сообщения: 50
Зарегистрирован: 21 ноя 2007, 11:02
Откуда: Kazan

Потоковая защищенность StiReport

Сообщение ask »

А как по правильному передать объект StiReport в другой поток. Я пробую через Clone() но при вызове метода Print, почему то начинается компиляция отчета и она почему отваливается с ошибкой
2008:06:23, 11:33: StiReport: c:\Documents and Settings\Zinurov.PATRIOT\Local Settings\Temp\fgbuamy0.0.cs(14,34) : error CS0234: The type or namespace name 'Двусторонний_образ' does not exist in the namespace 'Reports' (are you missing an assembly reference?)
2008:06:23, 11:33: StiReport: Compiling report...ERROR
2008:06:23, 11:33: StiReport: Method : [Compile] : c:\Documents and Settings\Zinurov.PATRIOT\Local Settings\Temp\fgbuamy0.0.cs(14,34) : error CS0234: The type or namespace name 'Двусторонний_образ' does not exist in the namespace 'Reports' (are you missing an assembly reference?)

Двусторонний образ - это имя отчета. Класс отчета загружается из dll, к нему подгружаются данные, вызывается Render, потом Clone и у клонированного обьекта вызывается метод Print.
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Потоковая защищенность StiReport

Сообщение Vital »

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

Если у Вас стоит задача просто напечатать отчет в другом потоке то проще сохранить его в строку (вернее результат его построения). Передать строку в другой поток. затем создать новый отчет и произвести печать. Смотрите методы SaveDocumentToString и LoadDocumentFromString у StiReport.

Спасибо.
Ответить