【发布时间】:2021-06-07 13:33:50
【问题描述】:
根据 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 已经完成了它的初始化。
如果在 InitializeAsync 中的“等待”之后将 Navigate 移至该代码,则该代码有效。我可能不明白“等待”,我认为它会延迟 Form 构造函数和 Load 事件的完成,直到 CoreWebView2 完成之后。
我想将 Navigate 放在 Form Load 事件处理程序中(但它会在 CoreWebView2 准备好之前触发)。
我是不是不明白,或者这里是否存在与 CoreWebView2 相关的错误,即使它在“initializeComplete”事件触发后也没有被初始化?
VS2019 16.9、Net 4.7.2、webview2 版本 91.0.823.0 金丝雀
更新 (2021-03-19):如果将 'webView2.NavigateToString()' 替换为 'webView2.CoreWebView2.NavigateToString()',它就可以工作。但鉴于事件名称,它似乎应该在那个时候工作。
【问题讨论】:
-
将
await webView2.EnsureCoreWebView2Async();移动到Form.Load并使处理程序async。 -
当您调用
async void方法时,它实际上是“一劳永逸”。它不会await调用,而是立即继续。