Canceling the .Render()?
Posted: Wed Feb 21, 2018 11:35 pm
Folks,
I need to give users the ability to cancel a rendering StiReport. I killed two days trying everything I could think of. Any suggestions?
• Tried passing the UI's report object into a BackgroundWorker and firing the report.Render() routine inside it. That failed because of cross-threading issues. The stack-trace indicates some kind of TextBox or font-sizing issue going on inside.
• Tried passing the report object into another Thread entirely using Tasks. Same issue.
• Tried creating code-only versions of the StiReport object to avoid any connection to the UI. Same issue.
• I tried to make a disconnected clone by serializing the report to JSON and back – but the serialization failed because an internal property had no value.
o Tried to instantiate that property (PageNumberThrough, an int property) but it’s read-only and apparently only created when rendering begins
• I did manage to hook up the Report_Rendering event, which fires once per page. I figured with this I could let the user click the Cancel button, set some flag-Boolean to false, and the next time the Rendering event fires I would call report.IsStopped=true to stop it. BUT…the user cannot click the Cancel button, because the .Render routine “owns” the UI thread.
• Tried to implement Application.DoEvents() to let the UI “listen” to other UI activity, like a user clicking Cancel. But Silverlight doesn’t have a .DoEvents() method.
Ideas?
I need to give users the ability to cancel a rendering StiReport. I killed two days trying everything I could think of. Any suggestions?
• Tried passing the UI's report object into a BackgroundWorker and firing the report.Render() routine inside it. That failed because of cross-threading issues. The stack-trace indicates some kind of TextBox or font-sizing issue going on inside.
• Tried passing the report object into another Thread entirely using Tasks. Same issue.
• Tried creating code-only versions of the StiReport object to avoid any connection to the UI. Same issue.
• I tried to make a disconnected clone by serializing the report to JSON and back – but the serialization failed because an internal property had no value.
o Tried to instantiate that property (PageNumberThrough, an int property) but it’s read-only and apparently only created when rendering begins
• I did manage to hook up the Report_Rendering event, which fires once per page. I figured with this I could let the user click the Cancel button, set some flag-Boolean to false, and the next time the Rendering event fires I would call report.IsStopped=true to stop it. BUT…the user cannot click the Cancel button, because the .Render routine “owns” the UI thread.
• Tried to implement Application.DoEvents() to let the UI “listen” to other UI activity, like a user clicking Cancel. But Silverlight doesn’t have a .DoEvents() method.
Ideas?