MAUI应用WebView崩溃问题求助:特定HTML赋值场景异常
MAUI WebView 连续赋值Html后Reload崩溃的原因及解决办法
问题场景
我创建了一个包含WebView的MAUI应用,代码如下:
MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="WebViewTest.MainPage"> <VerticalStackLayout> <Button x:Name="btn" WidthRequest="400" HeightRequest="50" Text="Go" Clicked="btn_Clicked" /> <WebView x:Name="web" WidthRequest="400" HeightRequest="400" Background="blue" /> </VerticalStackLayout> </ContentPage>
后台代码
namespace WebViewTest; public partial class MainPage : ContentPage { HtmlWebViewSource src = new(); public MainPage() { InitializeComponent(); web.Source = src; } private void btn_Clicked(object sender, EventArgs e) { Random rnd = new(); src.Html = $"<h1>Hello World {rnd.Next()}!</h1><br>"; // 取消注释下面这行后,第一次点击按钮程序崩溃,连续点击两次则恢复正常 //src.Html = $"<h1>Hello World {rnd.Next()}!</h1>"; web.Reload(); } }
原因分析
这个问题的核心是竞态条件:当连续两次修改同一个HtmlWebViewSource实例的Html属性,紧接着调用web.Reload()时,WebView的原生渲染线程可能还在处理第一次的Html更新请求,第二次的属性修改会打断这个过程,导致原生WebView控件内部状态紊乱,最终引发崩溃。
而第二次点击按钮时,WebView已经完成了前一次的加载流程,处于稳定状态,此时连续修改Html再Reload就不会触发冲突。
解决方案
最直接的解决方式是避免重复修改同一个HtmlWebViewSource实例,每次需要更新Html时,创建新的HtmlWebViewSource实例并赋值给WebView.Source,这样WebView会触发全新的加载流程,不会和之前的更新操作冲突。修改后的后台代码如下:
namespace WebViewTest; public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); } private void btn_Clicked(object sender, EventArgs e) { Random rnd = new(); // 创建新的HtmlWebViewSource实例 var newSrc = new HtmlWebViewSource(); newSrc.Html = $"<h1>Hello World {rnd.Next()}!</h1><br>"; newSrc.Html = $"<h1>Hello World {rnd.Next()}!</h1>"; // 直接赋值Source,WebView会自动加载新内容,无需调用Reload web.Source = newSrc; } }
另外也可以优化逻辑,避免连续两次赋值Html属性——如果最终只需要第二次的Html内容,直接赋值一次即可,没必要先设置带<br>的版本再覆盖。
内容的提问来源于stack exchange,提问作者Remo Pini
相关产品推荐
相关产品推荐

