0

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
Tsaras
  • 455
  • 2
  • 4
  • 18

0 Answers0