You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:40:28