Есть отчет, который формируется в фоновом потоке и возвращается в пользовательский контрол в готовом виде для отображения.
Вызов из пользовательского контрола такой
Код: Выделить всё
.....
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