You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 10 Mobile 1511版本BackRequested事件触发应用崩溃问题

UWP WebView 系统返回键崩溃问题解决方案

根因说明

该问题本质是线程上下文冲突导致:

  • UWP 系统级返回事件(SystemNavigationManager.GetForCurrentView().BackRequested、HardwareButtons.BackPressed)的触发线程,和默认模式下 WebView 绑定的 UI 线程存在调度冲突
  • YouTube 视频页加载过程中,WebView 内部有大量媒体渲染、JS 执行、资源加载任务,占用 UI 线程调度队列,此时直接在返回事件中操作 WebView 会触发底层未捕获的 COM 异常
  • 调试模式下调试器会调整线程调度优先级、附带异常容错逻辑,因此不会复现;应用内自定义返回按钮本身由 UI 线程触发,上下文匹配,因此运行正常
  • 切换到 WebViewExecutionMode.SeparateThread 后 WebView 有独立的调度队列,避开了 UI 线程冲突,因此不会崩溃

可行修复方案

方案1:强制封送 WebView 操作到 UI 线程(最稳妥,无需修改 WebView 执行模式)

修改返回事件代码,所有 WebView 相关操作都通过 UI 线程 Dispatcher 执行,避免上下文不匹配:

private async void CurrentView_BackRequested(object sender, BackRequestedEventArgs e)
{
    e.Handled = true;
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        if (appView.IsFullScreenMode)
        {
            appView.ExitFullScreenMode();
            return;
        }
        
        Frame frame = Window.Current.Content as Frame;
        if (!frame.CanGoBack && currentWebView.CanGoBack)
        {
            // 导航未完成时先取消当前导航再回退,额外增加容错
            if (currentWebView.IsNavigationStarted)
            {
                currentWebView.Stop();
            }
            currentWebView.GoBack();
        }
        else
        {
            if (PivotMain.Items.Count > 1)
            {
                CloseOneTab(PivotMain.SelectedWebViewItem);
            }
            else
            {
                e.Handled = false;
            }
        }
    });
}

方案2:合理使用 WebViewExecutionMode.SeparateThread 模式

你担心的 SeparateThread 风险大部分情况下不存在,微软官方明确推荐高负载 WebView 场景(比如视频播放、复杂网页交互)使用该模式,能大幅降低 UI 线程阻塞概率,仅需注意所有跨线程访问 WebView 的操作都通过 WebView 自身的 Dispatcher 封送即可,稳定性有保障。

内容的提问来源于stack exchange,提问作者10 Develops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:24:01