На днях переделал формирование отчета в потоки, для их асинхронного формирования. Все работает вроде как надо, за исключением нескольких не ясных моментов.
Для затравки основные куски кода. Оба куска принадлежат методам одного класса, первый часть метода потока.
Формирование отчета:
Код: Выделить всё
....
Report = new StiReport();
Report.Load(fn);
....
_lastState = "Формирование отчета";
Report.Render();
_lastState = "Формирование отчета завершено";
_done = true;
....
Код: Выделить всё
public string GetState() {
var p = Report == null ? 0 : (_done ? 100 : Report.ProgressOfRendering);
return "{ \"progress\": " + p + ", \"msg\": " + JsonConvert.SerializeObject(_lastState) + " }";
}
Код: Выделить всё
protected void Page_Load(object sender, EventArgs e) {
....
Viewer.Report = r.Report;
}
Код: Выделить всё
<%@ Register Assembly="Stimulsoft.Report.Web, Version=2012.3.1500.0, Culture=neutral, PublicKeyToken=ebe6666cba19647a"
Namespace="Stimulsoft.Report.Web" TagPrefix="cc1" %>
....
<cc1:StiWebViewer ID="Viewer" runat="server" Width="100%" GlobalizationFile="/Localization/ru.xml"
RenderMode="AjaxWithCache" ImagesPath="/_images/Stimulsoft/" ToolbarAlignment="Center"
ImageFormat="Png" AllowBookmarks="False" AllowPrintBookmarks="False" ShowBookmarksButton="False" />
А теперь вопрос/проблемы:
- * Свойство Report.ProgressOfRendering добирается до 99, никогда не получалось 100. Даже когда отчет фактически показывался на экран.
* После формирования отчета (Report.ProgressOfRendering == 99), отчет продолжает висеть фактически х2 вермени потраченного на предыдущие 99% "времени".
Я читал в параллельных ветках о событиях Rendering и др., однако не понял чем из использование по сути отличается от свойства ProgressOfRendering.