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

