c#-cefsharp 79.1.35中的更改(从75.1.143起)创建:'调用线程无法访问此对象,因为其他线程拥有它。'

问题描述 投票:1回答:1

我最近将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:'调用线程无法访问此对象,因为其他线程拥有它。']

在下一行:

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

如果需要,我将很乐意提供其他信息。

c# wpf cefsharp
1个回答
1
投票

直到下一个错误修复版本,您可以通过使用IBrowser提供的LoadingStateChangedEventArgs实例来解决此问题。以下示例

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

© www.soinside.com 2019 - 2024. All rights reserved.