在 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())
如果业务允许,使用非模态窗体
WebView2 中通过按钮点击网页元素调用 C# WinForm 的 ShowDialog() 导致程序崩溃
于 2025-04-07 18:03:35 首次发布


388

被折叠的 条评论
为什么被折叠?



