c# - cefsharp 79.1.35(来自 75.1.143)的变化创建:'The calling thread cannot access this object because a different thread owns it.'

c# - Changes in cefsharp 79.1.35 (from 75.1.143) creates: 'The calling thread cannot access this object because a different thread owns it.'

我最近将 cefsharp.wpf 的 NuGet 包从 75.1.143 更新到 79.1.35,现在以下代码不再有效:

public class Handle
{
    string source = null;
        int loaded = 0;
        private RequestHandler _requestHandler;
        public IWebBrowser _browser;
        public int previousRequestNrWhereLoadingFinished = -1;

        public Handle()
        {
            var settings = new CefSharp.Wpf.CefSettings()
            {
                CachePath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\Cache")
            };

            settings.CefCommandLineArgs.Add("enable-media-stream", "1");

            Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);
            _browser = new CefSharp.Wpf.ChromiumWebBrowser();
            _requestHandler = new RequestHandler();
            _browser.RequestHandler = _requestHandler;
        }

        public void OnIsBrowserInitializedChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if (_browser.IsBrowserInitialized)
            {
                status = 1;
            }
            //status = 0;
        }

        public async void _browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
        {
            if (!e.IsLoading)
            {
                if (previousRequestNrWhereLoadingFinished < _requestHandler.NrOfCalls)
                {
                    previousRequestNrWhereLoadingFinished = _requestHandler.NrOfCalls;
                    source = await _browser.GetBrowser().MainFrame.GetSourceAsync();
                    ...
                }
            }
        }
...
}

我得到的错误是:"System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it.'"

在下一行:

source = await _browser.GetBrowser().MainFrame.GetSourceAsync();

到目前为止我不明白为什么会这样,你能帮我解决这个问题吗?

这可能与新版本的变化有关,我看了它们,但我能找到到底是什么破坏了它。

感谢您的宝贵时间和帮助,非常感谢。

更新: 根据评论中的要求,这里是堆栈调用:

This exception was originally thrown at this call stack:
System.Windows.Threading.Dispatcher.VerifyAccess()
System.Windows.DependencyObject.GetValue(System.Windows.DependencyProperty)
CefSharp.Wpf.ChromiumWebBrowser.IsBrowserInitialized.get()
CefSharp.WebBrowserExtensions.ThrowExceptionIfBrowserNotInitialized(CefSharp.IWebBrowser)
CefSharp.Wpf.ChromiumWebBrowser.GetBrowser()
First_4_Figures.MainWindow.Handle._browser_LoadingStateChanged(object, CefSharp.LoadingStateChangedEventArgs) in MainWindow.xaml.cs

如果需要,我很乐意提供更多信息。

在下一个错误修复版本之前,您可以使用 LoadingStateChangedEventArgs 提供的 IBrowser 实例解决该问题。下面的例子

public async void _browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
    if (!e.IsLoading)
    {
        if (previousRequestNrWhereLoadingFinished < _requestHandler.NrOfCalls)
        {
            previousRequestNrWhereLoadingFinished = _requestHandler.NrOfCalls;
            source = await e.Browser.MainFrame.GetSourceAsync();
            ...
        }
    }
}

问题https://github.com/cefsharp/CefSharp/issues/3032