我最近将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
如果需要,我将很乐意提供其他信息。
直到下一个错误修复版本,您可以通过使用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();
...
}
}
}