Страница 1 из 1
Потоковая защищенность StiReport
Добавлено: 17 июн 2008, 03:44
ask
Пытаюсь использовать обьект StiReport в различных потоках, а именно при печати. Можно ли это делать, документации что то не нашел у вас на эту тему.
Потоковая защищенность StiReport
Добавлено: 19 июн 2008, 20:10
Vital
Здравствуйте,
Никаких проблем с формированием, экспортом или печатью отчетов в разных потоках быть не должно. Если будут какие то проблемы пишите, будем исправлять.
Спасибо.
Потоковая защищенность StiReport
Добавлено: 20 июн 2008, 07:02
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;
}
}
}
Потоковая защищенность StiReport
Добавлено: 20 июн 2008, 09:40
ask
Я использую 2007.3. Правку надо делать в статическом конструкторе StiReport?
Потоковая защищенность StiReport
Добавлено: 20 июн 2008, 10:48
NSG
Да, у нас тоже используется эта версия. Корректировку надо сделать в классе StiReport.
Есть тут небольшое допущение, что Вы все время будете использовать одни и те же потоки, иначе надо предусмотреть освобождение уже неиспльзованных ресурсов в measureGraphicsArray, например по завершению потоков.
Или подождите, какой вариант предложат авторы.
Потоковая защищенность StiReport
Добавлено: 20 июн 2008, 20:30
Ivan
Здравствуйте.
В версии 2008.2 в майских предрелизных билдах произведены некоторые изменения, касающиеся MeasureGraphics при многопоточной работе. На всех наших примерах проблем более не наблюдалось. Если Вы найдете еще какие-нибудь нюансы работы - пишите, будем исправлять.
Спасибо.
Потоковая защищенность StiReport
Добавлено: 23 июн 2008, 06:49
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.
Потоковая защищенность StiReport
Добавлено: 23 июн 2008, 14:30
Vital
Здравствуйте,
Если у Вас стоит задача просто напечатать отчет в другом потоке то проще сохранить его в строку (вернее результат его построения). Передать строку в другой поток. затем создать новый отчет и произвести печать. Смотрите методы SaveDocumentToString и LoadDocumentFromString у StiReport.
Спасибо.