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();
...
}
}
}
我最近将 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();
...
}
}
}