I have a class that runs an async method which fires an event upon completion.
public class PdfRenderer
{
public Uri PdfUri { get; set; }
public event EventHandler PdfCreated;
protected virtual void onPdfCreated(EventArgs e)
{
PdfCreated?.Invoke(this, e);
}
public async Task renderPdfAsync()
{
PdfUri = await renderPdf();
onPdfCreated(new EventArgs());
}
}
In the WPF form code, I subscribe to this event. The event handler sometimes works fine and sometimes does not, giving me the following error when accessing a WebView2 control in my form:
"The calling thread cannot access this object because a different thread owns it."
public PdfReport()
{
InitializeComponent();
// Within the form constructor I subscribe some renderers and make them do work concurrently.
for (int i = 0; i < renderers.Count; i++)
{
renderers[i].PdfCreated += PdfReport_PdfCreated;
renderers[i].renderPdfAsync();
}
}
private void PdfReport_PdfCreated(object sender, System.EventArgs e)
{
PdfRenderer renderer = sender as PdfRenderer;
if (renderer is null) return;
webView.Source = renderer.PdfUri; // Sometimes error
}
Is there a better way of sending events to the UI thread so that this error doesn't show up?
Stack trace if it is of any help:
at System.Windows.Threading.Dispatcher.VerifyAccess()
at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
at Microsoft.Web.WebView2.Wpf.WebView2.set_Source(Uri value)
at Lusas.DesignLib.UI.ReportView.showPDFForSelectedDesignCheck(Uri pdfUri) in E:\xxx\PdfReport.xaml.cs:line 133