WebView2 ExecuteScriptAsync任务永久阻塞死锁问题求助
解决WebView2 ExecuteScriptAsync死锁问题
死锁根源
你代码里的核心问题是UI线程被同步阻塞:在WinForms按钮点击事件bnNewReguest_Click中,调用t.Result等待异步任务完成,直接卡住了UI线程。而WebView2的ExecuteScriptAsync内部需要依赖UI线程完成后续回调,导致UI线程被堵、异步任务无法收尾,形成死锁。
修复方案
把UI事件处理方法改成异步模式,用await替代同步阻塞的Result,让UI线程能正常处理WebView2的回调任务。
修改后的完整代码
// 将事件处理方法改为async void(WinForms事件允许这种写法) private async void bnNewReguest_Click(object sender, EventArgs e) { string sHtml = await GetTextAsync(); if (string.IsNullOrEmpty(sHtml)) { MessageBox.Show("Wait a moment..."); return; } if (!sHtml.Contains("shortcutItem_12345")) { MessageBox.Show("Please wait for the page to load"); return; } // 点击操作也用await,保持异步流程一致 await webView21.ExecuteScriptAsync("document.getElementById('shortcutItem_12345').click()"); } private async Task<string> GetTextAsync() { // 确保CoreWebView2初始化完成,比直接返回空更可靠 if (webView21.CoreWebView2 == null) { await webView21.EnsureCoreWebView2Async(); if (webView21.CoreWebView2 == null) { return ""; } } var script = "document.documentElement.outerHTML"; // 用ConfigureAwait(false)让解码操作在非UI线程执行,减轻UI负担 string sHtml = await webView21.CoreWebView2.ExecuteScriptAsync(script).ConfigureAwait(false); string sHtmlDecoded = System.Text.RegularExpressions.Regex.Unescape(sHtml); return sHtmlDecoded; }
关键改动说明
- 把
bnNewReguest_Click改为async void,用await GetTextAsync()替代t.Result,彻底避免UI线程被同步阻塞。 - 新增
await webView21.EnsureCoreWebView2Async(),确保WebView2核心对象初始化完成后再执行脚本,避免空引用或初始化未完成的问题。 - 点击操作也用
await,保持异步流程一致,避免潜在的线程冲突。
内容的提问来源于stack exchange,提问作者Zbyszko
相关产品推荐
相关产品推荐

