Проблема при формировании отчета в фоновом потоке
Добавлено: 04 апр 2016, 13:56
Добрый день.
Есть отчет, который формируется в фоновом потоке и возвращается в пользовательский контрол в готовом виде для отображения.
Вызов из пользовательского контрола такой
Это метод, где формируется отчет.Отчет самостоятельно получает данные из базы, поэтому процесс довольно продолжительный.
На главной форме на время формирования отчета выводится прогрессбар. Собственно ради прогрессбара и для того чтобы сохранить откликаемость главной формы вся эта многопоточность и затевалась.
Но в момент рендеринга возникает ошибка "Cross-thread operation not valid: Control 'frmMain' accessed from a thread other than the thread it was created on." И это совершенно непонятно, т.к. отчет рендерится в том же потоке, где и был создан.
Ошибку удается одолеть двумя способами, первый ч\з invoke и делегат
и второй вызывать rpt.Render(true); уже после получения rpt из фонового потока
Но оба варианта не совсем то, чего бы хотелось.
Не могли бы вы пояснить причину ошибки и как правильно решать задачу формирования отчета в фоновом потоке?
Использую Stimulsoft 2013.1.16, VS2012, Win7-64
Есть отчет, который формируется в фоновом потоке и возвращается в пользовательский контрол в готовом виде для отображения.
Вызов из пользовательского контрола такой
Код: Выделить всё
.....
Task<Stimulsoft.Report.StiReport> ts1 =
Task<Stimulsoft.Report.StiReport>.Factory.StartNew(() =>
cEdgingInventory.GetMatInvReportByAckAndExpDates(dtAck,dtExp, facID, facName, this));
do //ждать выполнения задачи
{
Application.DoEvents();
ts1.Wait(5);
} while (!ts1.IsCompleted);
stiPreview.Report = ts1.Result;
Код: Выделить всё
public static Stimulsoft.Report.StiReport GetMatInvReportByAckAndExpDates(DateTime adtAck, DateTime adtExplosion,
int aFactoryId, string aFactoryName, ucEdgingInventory cntrl)
{
StiReport rpt = new Stimulsoft.Report.StiReport();
.......
.......
rpt.Render(true); //здесь ошибка Cross-thread operation not valid: Control 'frmMain' accessed from a thread other than the thread it was created on.
return rpt;
}
Но в момент рендеринга возникает ошибка "Cross-thread operation not valid: Control 'frmMain' accessed from a thread other than the thread it was created on." И это совершенно непонятно, т.к. отчет рендерится в том же потоке, где и был создан.
Ошибку удается одолеть двумя способами, первый ч\з invoke и делегат
Код: Выделить всё
delegate void delRender(bool bl);
...
//потокобезопасный вызов rpt.Render
if (cntrl.InvokeRequired)
cntrl.Invoke(new delRender(rpt.Render), new object[] { true });
else
rpt.Render(true);
return rpt;
Код: Выделить всё
Task<Stimulsoft.Report.StiReport> ts1 =
Task<Stimulsoft.Report.StiReport>.Factory.StartNew(() =>
cEdgingInventory.GetMatInvReportByAckAndExpDates(dtAck,dtExp, facID, facName, this));
.............
stiPreview.Report = ts1.Result;
stiPreview.Report.Render(true);
Не могли бы вы пояснить причину ошибки и как правильно решать задачу формирования отчета в фоновом потоке?
Использую Stimulsoft 2013.1.16, VS2012, Win7-64