c# - Изменения в cefsharp 79.1.35 (из 75.1.143) создают: «Вызывающий поток не может получить доступ к этому объекту, поскольку он принадлежит другому потоку». - PullRequest
1 голос
/ 30 января 2020

Я недавно обновил пакет NuGet файла cefsharp.wpf с 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

Я с удовольствием предоставлю дополнительную информацию, если потребуется.

1 Ответ

1 голос
/ 01 февраля 2020

До следующего выпуска исправления ошибки вы можете обойти проблему, используя экземпляр 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

...