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

WPF中调用SendDataToWeb时CoreWebView2为空问题求助

解决WebView2 CoreWebView2为空的问题

问题根源

你的Initialize是异步void方法,调用后不会等待EnsureCoreWebView2Async执行完成就可能触发SendDataToWeb,此时CoreWebView2还未完成初始化,就会出现空引用错误。另外异步void方法无法被外部等待,也难以捕获初始化过程中的异常。

修复方案

1. 重构Initialize方法为async Task

将异步void改为async Task,让外部可以等待初始化完成,避免提前调用SendDataToWeb:

private readonly WebView2 webView2;
private bool _isCoreWebView2Initialized;

// 改为async Task,允许外部等待初始化完成
private async Task InitializeAsync()
{
    try
    {
        await webView2.EnsureCoreWebView2Async();
        webView2.CoreWebView2.Navigate("http://localhost:4200/");
        webView2.CoreWebView2.WebMessageReceived += CoreWebView2_WebMessageReceived;
        _isCoreWebView2Initialized = true;
    }
    catch (Exception ex)
    {
        // 处理初始化异常,比如日志记录或提示用户
        Console.WriteLine($"WebView2初始化失败: {ex.Message}");
    }
}

2. 优化SendDataToWeb方法

添加初始化状态检查,避免空引用:

public void SendDataToWeb(string data)
{
    if (!_isCoreWebView2Initialized || webView2.CoreWebView2 == null)
    {
        // 未初始化完成,可选择抛出异常、缓存数据或提示
        throw new InvalidOperationException("WebView2尚未完成初始化,请等待初始化完成后再调用此方法");
        // 或者缓存数据,待初始化完成后发送:
        // _pendingMessages.Add(data);
    }

    // 注意:如果data本身已经是字符串,Serialize会额外加引号,若只需传递字符串内容,用PostWebMessageAsString更合适
    var json = JsonSerializer.Serialize(data);
    webView2.CoreWebView2.PostWebMessageAsJson(json);
}

3. 确保初始化完成后再调用SendDataToWeb

在调用InitializeAsync的地方使用await等待完成,比如窗口的Loaded事件中:

private async void Window_Loaded(object sender, RoutedEventArgs e)
{
    await InitializeAsync();
    // 初始化完成后再调用SendDataToWeb
    SendDataToWeb("测试数据");
}

额外优化:处理初始化前的待发送消息

如果需要处理初始化完成前的待发送数据,可以维护一个消息队列,在InitializeAsync完成后批量发送缓存的消息:

private readonly List<string> _pendingMessages = new List<string>();

public void SendDataToWeb(string data)
{
    if (!_isCoreWebView2Initialized || webView2.CoreWebView2 == null)
    {
        _pendingMessages.Add(data);
        return;
    }

    var json = JsonSerializer.Serialize(data);
    webView2.CoreWebView2.PostWebMessageAsJson(json);
}

// 在InitializeAsync中初始化完成后发送缓存消息
private async Task InitializeAsync()
{
    try
    {
        await webView2.EnsureCoreWebView2Async();
        // ... 其他初始化代码 ...
        _isCoreWebView2Initialized = true;

        // 发送缓存的消息
        foreach (var msg in _pendingMessages)
        {
            var json = JsonSerializer.Serialize(msg);
            webView2.CoreWebView2.PostWebMessageAsJson(json);
        }
        _pendingMessages.Clear();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"WebView2初始化失败: {ex.Message}");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:15:26