【问题标题】:WebView2 - after call function 'navigate2', waiting time too longWebView2 - 调用函数“navigate2”后,等待时间太长
【发布时间】:2021-11-24 23:24:35
【问题描述】:

我使用 WebView2 创建与 Edge 兼容的集成浏览器。为了构建我的 webview,我添加了四个监听器,当我们调用函数 'navigate2' 时会调用它们。

m_controlsWebView->add_SourceChanged(Microsoft::WRL::Callback<ICoreWebView2SourceChangedEventHandler>(
    this, &EdgeBrowser::OnWebViewSourceChanged)
    .Get(), &m_sourceChangedToken);

m_controlsWebView->add_ContentLoading(Microsoft::WRL::Callback<ICoreWebView2ContentLoadingEventHandler>(
    this, &EdgeBrowser::OnWebViewContentLoading)
    .Get(), &m_contentLoadingToken);

m_controlsWebView->add_HistoryChanged(Microsoft::WRL::Callback<ICoreWebView2HistoryChangedEventHandler>(
    this, &EdgeBrowser::OnWebViewHistoryChanged)
    .Get(), &m_historyChangedToken);

m_controlsWebView->add_NavigationCompleted(Microsoft::WRL::Callback<ICoreWebView2NavigationCompletedEventHandler>(
    this, &EdgeBrowser::OnWebViewNavigationCompleted)
    .Get(), &m_navigationCompletedToken);

OnWebViewHistoryChanged 代码:

HRESULT EdgeBrowser::OnWebViewHistoryChanged(ICoreWebView2* sender, IUnknown* args) {
     GEMLOG(InfoLevel, "HRESULT IntegratedBrowser2::OnWebViewHistoryChanged(ICoreWebView2* sender, IUnknown* args)", "OK")
     return S_OK;
}

OnWebViewNavigationCompleted 的代码:

HRESULT EdgeBrowser::OnWebViewNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args) {

if (args)
{
    BOOL succeedeed;
    args->get_IsSuccess(&succeedeed);

    if (succeedeed == FALSE)
    {
        COREWEBVIEW2_WEB_ERROR_STATUS error_stats;
        args->get_WebErrorStatus(&error_stats);
        std::wstring error = this->WebErrorStatusToString(error_stats);
        std::string str_error = utils::wStringToString(error, CP_UTF8);

        GEMLOG(ErrorLevel, "HRESULT EdgeBrowser::OnWebViewNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args)", str_error.c_str())
    }
    else
    {
        GEMLOG(InfoLevel, "HRESULT EdgeBrowser::OnWebViewNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args)", "OK")
    }
}
return S_OK;
}

在调用 Microsoft 函数“navigate2”后,我注意到调用函数 OnWebViewHistoryChanged 和 OnWebViewNavigationCompleted 之间的延迟超过一分钟。

为什么?这种放缓的不同可能原因是什么?

 04-10-2021 15:56:01 0x00002428     (InfoLevel,HRESULT EdgeBrowser::OnWebViewSourceChanged(ICoreWebView2* sender, ICoreWebView2SourceChangedEventArgs* args),) OK
 04-10-2021 15:56:01 0x00002428     (InfoLevel,HRESULT EdgeBrowser::OnWebViewContentLoading(ICoreWebView2* sender, ICoreWebView2ContentLoadingEventArgs* args),) The operation completed successfully.
 04-10-2021 15:56:01 0x00002428     (InfoLevel,HRESULT EdgeBrowser::OnWebViewHistoryChanged(ICoreWebView2* sender, IUnknown* args),) OK
 04-10-2021 15:57:04 0x00002428     (InfoLevel,HRESULT EdgeBrowser::OnWebViewNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args),) OK

【问题讨论】:

    标签: c++ win32gui webview2


    【解决方案1】:

    CoreWebView2.NavigationCompleted event 是在 DOM body.onload event 引发之后引发的。这可能会在很久以后发生,因为此事件会等待 HTML 文档中的所有子下载完成,包括所有图像、子框架等。

    或者,您可以考虑使用DOM document.DOMContentLoaded event 引发的CoreWebView2.DOMContentLoaded event,它在解析DOM 后引发并且不等待子下载完成。

    【讨论】:

      【解决方案2】:

      我忘了给你解释一个细节。

      对于我在 WIN32 中的应用程序,在另一台机器 Windows 10 上,我安装了 WebView2Loader.dll(32 位)和 WebView2 运行时(32 位)。所以,我也部署了我的应用程序,但是使用我部署的 WIN32 应用程序,当我尝试导航到一个简单的网页时,它需要一分钟,在“进程资源管理器”中,我注意到我的应用程序占用了 90% 的 CPU !!!

      为什么?

      【讨论】:

        猜你喜欢
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-05
        • 2017-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多