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
相关产品推荐
相关产品推荐

