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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:15:36