WebView2 中通过按钮点击网页元素调用 C# WinForm 的 ShowDialog() 导致程序崩溃

在 WebView2 中通过按钮点击调用 C WinForm 的 ShowDialog() 导致程序崩溃,通常与 UI 线程阻塞或 跨线程操作 有关。

window.chrome.webview.postMessage("openHistory", { sessionId: item.sessionId });


 问题原因分析
1. UI 线程阻塞:
    ShowDialog() 是模态对话框,会阻塞当前线程(通常是 UI 线程)。
    WebView2 依赖 UI 线程的消息循环处理异步事件(如 JavaScript 与 C 的通信)。若 UI 线程被阻塞,WebView2 可能无法正常处理内部消息,导致崩溃。

2. 跨线程操作:
    如果在非 UI 线程操作 WebView2 控件(如通过 Task.Run),可能违反线程安全规则,引发异常。

3. 资源释放问题:
    关闭对话框后,可能意外释放了 WebView2 相关资源(如 CoreWebView2 对象),导致后续操作崩溃。



 解决方案
 1. 确保在 UI 线程调用 ShowDialog()
    确保按钮点击事件在 UI 线程触发,避免跨线程调用。可通过 Invoke 方法强制在 UI 线程执行:
     csharp
     private void WebView2ButtonClickHandler(object sender, EventArgs e)
     {
         if (this.InvokeRequired)
         {
             this.Invoke(new Action(() => WebView2ButtonClickHandler(sender, e)));
             return;
         }
         using (var dialog = new YourForm())
         {
             dialog.ShowDialog();
         }
     }
     

 2. 改用非阻塞对话框(如 Show())
    如果业务允许,使用非模态窗体 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值