winforms WebView2.ExecuteStriptAsync责任被阻止得Forever

sbdsn5lh  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(153)

当我尝试读取加载到webview2控件中的某个网页的内容时,任务ExecuteScriptAsync永久阻塞。此后,应用程序没有响应,但站点仍在运行。该站点发布在公司的Intranet上,因此我无法在此处提供URL。它是Ivanti Service Desk。

private void bnNewReguest_Click(object sender, EventArgs e)
{
    var t = GetTextAsync();
    string sHtml = t.Result;
    if (!sHtml.Contains("shortcutItem_12345"))
    {
        MessageBox.Show("Please wait for the page to load");
        return;
    }
    webView21.ExecuteScriptAsync("document.getElementById('shortcutItem_12345').click()");
}

private async Task<string> GetTextAsync()
{

    if (webView21.CoreWebView2 == null)
    {
        MessageBox.Show("Wait a moment...");
        return "";
    }
    var script = "document.documentElement.outerHTML";
    string sHtml = await webView21.CoreWebView2.ExecuteScriptAsync(script);  // deadlock
    string sHtmlDecoded = System.Text.RegularExpressions.Regex.Unescape(sHtml);
    return sHtmlDecoded;
}

我也尝试了下面的代码,但结果是类似的。

string sHtml = await webView21.CoreWebView2.ExecuteScriptAsync(script).ConfigureAwait(false);

WebView2版本是1.0.1418.22。如何防止死锁?我发现了一个关于here相同问题的线程,但没有一个解决方案对我有效。

yxyvkwin

yxyvkwin1#

我描述了这个死锁on my blog。最好的解决方案是不阻塞异步代码。
在您的情况下,可能如下所示:

private async void bnNewReguest_Click(object sender, EventArgs e)
{
    string sHtml = await GetTextAsync();
    if (!sHtml.Contains("shortcutItem_12345"))
    {
        MessageBox.Show("Please wait for the page to load");
        return;
    }
    await webView21.ExecuteScriptAsync("document.getElementById('shortcutItem_12345').click()");
}

相关问题