即使在 CoreWebView2InitializationCompleted 事件发生后,EnsureCoreWebView2Async 也未准备好

2023-12-22

根据 Microsoft 在 Windows 窗体中开始使用 webView2(截至 2021 年 3 月 9 日),我得到了以下代码(未设置 webView2.source;从 Form.Designer.cs 中编辑):

    public Form1() {
      InitializeComponent();
      InitializeAsync();
    }

    async void InitializeAsync() {
      Console.WriteLine("InitializeAsync starting");
      await webView2.EnsureCoreWebView2Async(null);
      Console.WriteLine("InitializeAsync done");
    }

    private void Form1_Load(object sender, EventArgs e) {
      Console.WriteLine("Load event");
    }

    private void webView2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) {
      Console.WriteLine("CoreWebView2InitializationCompleted event");
      if ((webView2 == null) || (webView2.CoreWebView2 == null))
        Console.WriteLine("not ready");
      webView2.NavigateToString(File.ReadAllText("index.html"));
    }

我很惊讶在 NavigateToString() 处遇到异常:

System.InvalidOperationException
  HResult=0x80131509
  Message=The instance of CoreWebView2 is uninitialized and unable to complete this operation. See InitializeAsync.
  Source=Microsoft.Web.WebView2.WinForms
  StackTrace:
   at Microsoft.Web.WebView2.WinForms.WebView2.VerifyInitializedGuard()
   at Microsoft.Web.WebView2.WinForms.WebView2.NavigateToString(String htmlContent)
   at webview2_base.Form1.webView2_CoreWebView2InitializationCompleted(Object sender, CoreWebView2InitializationCompletedEventArgs e) in E:\Visual Studio 2019\source\repos\explore\webview2_base\Form1.cs:line 37
   at Microsoft.Web.WebView2.WinForms.WebView2.<InitCoreWebView2Async>d__13.MoveNext()

控制台输出为:

InitializeAsync starting
Load event
CoreWebView2InitializationCompleted event
Exception thrown: 'System.InvalidOperationException' in Microsoft.Web.WebView2.WinForms.dll
An exception of type 'System.InvalidOperationException' occurred in Microsoft.Web.WebView2.WinForms.dll but was not handled in user code
The instance of CoreWebView2 is uninitialized and unable to complete this operation. See InitializeAsync.

那是怎么回事?考虑到事件的标签,我本以为 CoreWebView2 会完成其初始化。

如果 Navigate 移至 InitializeAsync 中的“await”之后,该代码将起作用。我可能不理解“等待”,我认为它会延迟 Form 构造函数和 Load 事件的完成,直到 CoreWebView2 完成之后。

我想将 Navigate 放入 Form Load 事件处理程序中(但它在 CoreWebView2 准备好之前触发)。

我是否不明白某些事情,或者这里是否存在与 CoreWebView2 相关的错误,即使在“initializeComplete”事件已触发后也未初始化?

VS2019 16.9,Net 4.7.2,webview2版本91.0.823.0金丝雀

Update(2021-03-19):如果将“webView2.NavigateToString()”替换为“webView2.CoreWebView2.NavigateToString()”,则它可以工作。但考虑到事件名称,似乎两者都应该在此时起作用。


你需要使用await InitializeAsync();意思是async void InitializeAsync应该async Task InitializeAsync. Since async不能与构造函数一起使用,您必须从以下位置调用 InitializeAsyncForm1_Load.

请尝试以下操作:

using System.Diagnostics;

Option 1:

public Form1()
{
    InitializeComponent();
}

private async void Form1_Load(object sender, EventArgs e)
{
    webView2.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted;

    Debug.WriteLine("before InitializeAsync");
    await InitializeAsync();
    Debug.WriteLine("after InitializeAsync");

    //webView2.CoreWebView2.Navigate("https://www.microsoft.com");
    //Debug.WriteLine("after Navigate");

    if ((webView2 == null) || (webView2.CoreWebView2 == null))
    {
        Debug.WriteLine("not ready");
    }

    webView2.NavigateToString(System.IO.File.ReadAllText("index.html"));

    Debug.WriteLine("after NavigateToString");
}

private async Task InitializeAsync()
{
    Debug.WriteLine("InitializeAsync");
    await webView2.EnsureCoreWebView2Async(null);
    Debug.WriteLine("WebView2 Runtime version: " + webView2.CoreWebView2.Environment.BrowserVersionString);
}


private void WebView_CoreWebView2InitializationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e)
{
    Debug.WriteLine("WebView_CoreWebView2InitializationCompleted");
}

Output:

before InitializeAsync
InitializeAsync
WebView_CoreWebView2InitializationCompleted
WebView2 Runtime version: 89.0.774.48
after InitializeAsync
after NavigateToString

Update- 这是另一个选择

Option 2:

public Form1()
{
    InitializeComponent();
}

private async void Form1_Load(object sender, EventArgs e)
{
    webView2.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted;

    Debug.WriteLine("before InitializeAsync");
    await InitializeAsync();
    Debug.WriteLine("after InitializeAsync");

}

private async Task InitializeAsync()
{
    Debug.WriteLine("InitializeAsync");
    await webView2.EnsureCoreWebView2Async(null);
    Debug.WriteLine("WebView2 Runtime version: " + webView2.CoreWebView2.Environment.BrowserVersionString);

    //webView2.CoreWebView2.Navigate("https://www.microsoft.com");
    //Debug.WriteLine("after Navigate");

    if ((webView2 == null) || (webView2.CoreWebView2 == null))
    {
        Debug.WriteLine("not ready");
    }

    webView2.NavigateToString(System.IO.File.ReadAllText("index.html"));

    Debug.WriteLine("after NavigateToString");
}


private void WebView_CoreWebView2InitializationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e)
{
    Debug.WriteLine("WebView_CoreWebView2InitializationCompleted");
}

Output:

before InitializeAsync
InitializeAsync
WebView_CoreWebView2InitializationCompleted
WebView2 Runtime version: 89.0.774.48
after NavigateToString
after InitializeAsync
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使在 CoreWebView2InitializationCompleted 事件发生后,EnsureCoreWebView2Async 也未准备好 的相关文章

随机推荐

  • 通过 emacs -nw 打开多个垂直分割的文件

    Using emacs nw file1 file2我可以一次打开多个文件 然而 emacs 将以水平分割方式打开它们 有没有办法将默认分割行为设置为垂直 我看过 切换窗口分割 http www emacswiki org emacs To
  • Micronaut:如何获取 Prometheus 格式的指标?

    我应该如何配置 Micronaut 才能获得 metrics普罗米修斯格式 Used 微型机器人1 0 0 M3 Now micronaut metrics enabled true export prometheus enabled tr
  • 如何在swift中编写通用工厂方法?

    我不知道如何 如果可能的话 编写调用从常见已知基类 继承的泛型类型的构造函数的方法 以创建 T 的一些实例 而无需求助于显式工厂函数 即使用所有花哨的功能由类型推断提供 在操场上运行的示例 Let there be classes MyPo
  • JavaFx PieChart:控制大小

    我是 JavaFX 新手 我正在调整用 JavaFX 开发的应用程序 该应用程序使用大量彼此相邻的饼图 所有饼图都作为同一饼图的子项HBox 这些图表没有相同数量的类别 并且由于某种原因 其中一些类别变得比其他类别更大 有什么办法可以控制它
  • WebApi 上的 AngularJS 和 OWIN 身份验证

    我已经在我的 WebApi 上实现了基于 OWIN 令牌的身份验证 我还通过调用启用了 CORSapp UseCors Microsoft Owin Cors CorsOptions AllowAll 我可以从 angularjs Web
  • `create_task()` 中的任务何时在 asyncio 中执行?

    在下面的代码中 import asyncio async def task func print in task func return the result async def main loop print creating task
  • Sublime Text多光标快捷方式

    我是 emacs 的忠实用户 我非常喜欢这样一个事实 无需使用鼠标即可完成所有操作 我认为这个功能让 emacs 非常高效 我也是 Linux 上的 Sublime Text 的忠实粉丝 我喜欢您启用的多光标功能Ctrl left mous
  • 动态父浮动div 100%高度没有绝对位置?

    我在这里读了很多书 但找不到我的答案的解决方案 我有一个容器 div 有多个浮动的左 div 如下面的 html 所示 div class catbg0 div class catb1 div div class catb2 Board N
  • 如何使用 Excel 公式仅删除前导和尾随空格,同时在单词之间保留空格?

    在Excel中 TRIM 将删除文本前后的所有空格 同时还会删除单词之间的任何重复空格 是否有一个公式或其组合可以起到相同的作用TRIM 但在单词之间保留空格 在下面的示例中 我正在寻找一个可以实现虚构公式 WXYZ 的公式 TRIM Om
  • 单击“查看更多”按钮后文本视图会展开或收缩

    在我的 tableView 单元格中 我有一个 textView 我通过 JSON 获取其字符串并动态更新单元格高度 如下所示 func tableView tableView UITableView heightForRowAt inde
  • 搜索 NSString 是否包含值

    我有一些由几个字符构造的字符串值 我想检查它们是否存在于另一个 NSString 中 不区分大小写和空格 示例代码 NSString me toBe NSString target abcdetoBe than check if me is
  • 定义 JavaScript 源文件的字符编码

    我想向我的德国用户打印一条状态消息 其中包含变音符号 我还希望它们位于源文件中 而不必仅为消息下载和解析一些额外的文件 但是 我似乎找不到一种方法来定义 JS 源文件的编码 有没有类似HTML的东西http equiv 或者我应该在 HTT
  • PyTorch:用于训练和测试/验证的不同前向方法

    我目前正在尝试延长a model https github com microsoft MASS这是基于 FairSeq PyTorch 的 在训练过程中 我需要训练两个编码器 一个使用目标样本 另一个使用源样本 所以当前的forward函
  • 将 QPair 转换为 QVariant

    我有以下问题 我想通过TCP传输数据 并为此编写了一个函数 为了获得最大的可重用性 函数模板是f QPair
  • 在 C++ 中进行事件处理的正确方法是什么?

    我有一个应用程序需要按以下方式响应某些事件 void someMethodWithinSomeClass while true wait for event if event SomeEvent doSomething continue i
  • 在 Scala 中初始化通用变量

    如何在 Scala 中声明泛型变量而不对其进行初始化 或初始化为任何值 def foo T var t T tried null t def foo T var t T null asInstanceOf T t 而且 如果你不喜欢其中涉及
  • 将 setvbuf() 与 STDIN 流结合使用

    我正在编写一个小型 C 程序 它必须接受大于 4096 字节的输入流 我确实找到了一个推荐使用的帖子设置vbuf here 使 fgets 在 Linux 上发出更长的 read 调用 https stackoverflow com q 3
  • 理解图表[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 询问我们的问题推荐或查找书籍 工具 软件库 教程或其他场外资源与 Stack Overflow 无关 因为它们往往会吸引固执己见的答案和垃
  • scss mixin 中的选择器有效吗?

    CSS 语法一般是 selector declarations 我主要看到 mixin 负责处理declaration part example mixin border radius rad border radius rad and u
  • 即使在 CoreWebView2InitializationCompleted 事件发生后,EnsureCoreWebView2Async 也未准备好

    根据 Microsoft 在 Windows 窗体中开始使用 webView2 截至 2021 年 3 月 9 日 我得到了以下代码 未设置 webView2 source 从 Form Designer cs 中编辑 public For