【问题标题】:ExecuteScriptAsync().Result never return [duplicate]ExecuteScriptAsync().Result 永远不会返回 [重复]
【发布时间】:2022-01-08 09:33:49
【问题描述】:
var response2 = webView21.CoreWebView2.ExecuteScriptAsync("function foo(){return 1;}; foo();").Result;

if (response2 != null) //it never reach here
{
     //...
}

对于上面的代码,在第一行之后它不会继续,所以我无法得到javascript的结果。

但是对于这些代码:

string response1 = await webView21.CoreWebView2.ExecuteScriptAsync(
    "function foo(){return 1;}; foo();"
);

它立即返回 response1 = "1"

我想知道为什么。

【问题讨论】:

标签: webview2


【解决方案1】:

WebView2 threading documentation 谈到了这一点。 TLDR WebView2 依赖于 UI 线程消息泵和 Task.Result 块。

WebView2 依赖于 UI 线程的消息泵来运行事件处理程序回调和异步方法完成回调。如果您使用阻止消息泵的方法,例如 Task.Result 或 WaitForSingleObject,则您的 WebView2 事件处理程序和异步方法完成处理程序不会运行。例如,以下代码未完成,因为 Task.Result 在等待 ExecuteScriptAsync 完成时停止了消息泵。由于消息泵被阻塞,ExecuteScriptAsync 无法完成。

【讨论】:

    【解决方案2】:

    异步函数被一种特殊的类型包装(在 JS 中称为 Promise,在 C# 中称为任务)。 当您需要获取结果时,您应该使用关键字 await 来等待函数运行结束并“解包”结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-15
      • 2011-07-25
      • 1970-01-01
      • 2012-10-02
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多