如何在WPF窗口退出时终止后台运行的WebView2?
解决WPF窗口退出时终止WebView2并发送退出消息的问题
要解决直接关闭窗口时WebView2后台运行、服务器未收到退出消息的问题,你可以通过重写窗口的OnClosing方法,统一处理退出逻辑:
核心思路
- 拦截窗口关闭事件,先发送
leaveRoom消息给服务器 - 确保消息发送完成后,销毁WebView2的核心实例,终止后台进程
- 最后允许窗口正常关闭
修改后的代码实现
public Webcam() { InitializeComponent(); } protected override async void OnContentRendered(EventArgs e) { base.OnContentRendered(e); try { var webView2Environment = await CoreWebView2Environment.CreateAsync(); await webView.EnsureCoreWebView2Async(webView2Environment); webView.CoreWebView2.Navigate("ServerIP"); webView.CoreWebView2.NavigationCompleted += CoreWebView2_NavigationCompleted; } catch (Exception exception) { // 建议添加异常日志,方便排查问题 } } private void CoreWebView2_NavigationCompleted(object? sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs e) { string test = "UserID"; webView.CoreWebView2.PostWebMessageAsString(test); } // 重写窗口关闭逻辑 protected override async void OnClosing(System.ComponentModel.CancelEventArgs e) { base.OnClosing(e); // 确保WebView2已初始化 if (webView.CoreWebView2 != null) { // 先取消默认关闭流程,处理退出逻辑 e.Cancel = true; // 发送leaveRoom消息给服务器 webView.CoreWebView2.PostWebMessageAsString("leaveRoom"); // 短时间等待,确保消息发送完成(时长可根据实际网络情况调整) await Task.Delay(300); // 销毁CoreWebView2实例,释放资源并终止后台进程 webView.CoreWebView2.Dispose(); webView.Dispose(); } // 允许窗口关闭 e.Cancel = false; } private void Button_Click(object sender, RoutedEventArgs e) { // 直接调用窗口关闭,统一走OnClosing的处理逻辑 this.Close(); }
关键说明
OnClosing方法会在窗口关闭(无论是点击按钮还是右上角关闭)时触发,确保退出逻辑统一执行- 使用
Task.Delay是简单的等待消息发送完成的方式,如果你的JS代码有退出确认回调,可以改成等待回调完成,这样更可靠 - 调用
CoreWebView2.Dispose()会彻底终止WebView2的后台进程,避免其继续运行
内容的提问来源于stack exchange,提问作者HaengG
相关产品推荐
相关产品推荐

