92394


### コードについて

提示コードはWebView2を使ってhtmlを描画するクラスとその初期化処理です。

### 知りたい事

`webView.EnsureCoreWebView2Async(null);`の処理が`///`コメント部内部の`Form1()`で実行されない原因が知りたい。

### 試したこと

`webView.EnsureCoreWebView2Async(null);`を`form()`関数で`InitializeAsync();`の中で実行されないので`Init()`関数を作ってその中で実行しましたが実行されていませんでした。

`view.Render()`関数内の描画処理に混ぜて行うと実行されるためawaitが原因と考えられるのですがなぜでしょうか?`
しっかりawaitで待機しています。`

参考サイトBを参考に関数を作成して試しましたが実行されていません。

#### 参考サイト

参考サイトA： <https://zenn.dev/vatscy/articles/ba2263bdfadfeb805379>  
参考サイトB： <https://stackoverflow.com/questions/66550671/ensurecorewebview2async-
not-ready-even-after-corewebview2initializationcompleted>

#### Form1.cs

[code]

    using Microsoft.Web.WebView2.Core;
    using Microsoft.Web.WebView2.WinForms;
    using Microsoft.Web.WebView2.Wpf;
    using System.Configuration;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Text.Json;
    using static System.Net.Mime.MediaTypeNames;
    
    namespace WinFormsApp1
    {
        public record Sample
        (
            string userName,
            string test,
            bool IsDelete
        );
    
    
        public partial class Form1 : Form
        {
            private HtmlView view;
            /// string text = System.IO.File.ReadAllText(@"debug.js");
            
    /////////////////////////////////////////////////////////////////////////////////////
            private async void Init()
            {
                await view.webView.EnsureCoreWebView2Async(null);
            }
    /////////////////////////////////////////////////////////////////////////////////////
    
    
    /////////////////////////////////////////////////////////////////////////////////////
            public Form1()
            {
                InitializeComponent();
    
                
                view = new HtmlView(new Size(Size.Width, Size.Height),this);
                //view.InitializeAsync();
    
                Init();
    
                view.Render("asset/index.html");
                view.Show();
    
            }
    /////////////////////////////////////////////////////////////////////////////////////
        }
    }
    
[/code]

#### HtmlView

[code]

    using Microsoft.Web.WebView2.WinForms;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace WinFormsApp1
    {
        public class HtmlView
        {
            public WebView2 webView;
    
            public HtmlView(Size size,Form form) 
            {
    
                webView = new WebView2();
                webView.Size = size;
                webView.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
                webView.BringToFront();
    
                form.Controls.Add(webView);
    
                //InitializeAsync();
    
            }
    
            public async void InitializeAsync()
            {
                await webView.EnsureCoreWebView2Async(null);
            }
    
    
            public void Show()
            {
                webView.Show();
            }
    /////////////////////////////////////////////////////////////////////////////////////
            public async void Render(string path)
            {
                
                StreamReader sr = new StreamReader("asset/index.html",Encoding.GetEncoding("UTF-8"));
                string str = sr.ReadToEnd();
    
                await webView.EnsureCoreWebView2Async(null);
    
                webView.NavigateToString(str);                    
            }
    /////////////////////////////////////////////////////////////////////////////////////
            public async void setJS(string path)
            {
                StreamReader srr = new StreamReader("asset/script/Main.js", Encoding.GetEncoding("UTF-8"));
                string ss = srr.ReadToEnd();
                await webView.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(ss);
    
            }
    
    
            public void JsonStringData(string jsonPath)
            {
                StreamReader str = new StreamReader("asset/test.json", Encoding.GetEncoding("UTF-8"));
                string json = str.ReadToEnd();
                webView.CoreWebView2.PostWebMessageAsJson(json);
    
    
            }
    
        }
    }
    
[/code]


CC BY-SA 4.0
2022-11-23T08:42:48.490
92393
2022-11-24T23:53:33.337
2022-11-24T23:53:33.337
3060
55177
question
c#
awaitを使った処理でWebView2.EnsureCoreWebView2Async(null)が待機されない原因が知りたい。


`async void Init()` とありますが、radianさんから
[Xabe.FFmpegで動画ファイルがエンコードされない原因が知りたいの回答](https://ja.stackoverflow.com/a/92059/4236)で

> イベントハンドラ以外のasync voidはやめましょう

とアドバイスを受けたのは覚えていますか？ また私からは[同回答](https://ja.stackoverflow.com/a/92068/4236)で

> `Form1_Load`メソッドが無難です。

とも提案したはずです。これらには意味があってのことです。というのも

>
[code]

>     public Form1()
>     {
>         InitializeComponent();
>  
>         view = new HtmlView(new Size(Size.Width, Size.Height),this);
>         //view.InitializeAsync();
>  
>         Init();
>  
>         view.Render("asset/index.html");
>         view.Show();
>     }
>  
[/code]

と`Form1`コンストラクタに処理を書かれていますが、コンストラクタ実行中はまだフォームを表示していません。そのことは、呼び出し元の`Program.cs`を読むとわかります。

[code]

    static void Main() {
        ApplicationConfiguration.Initialize();
        Application.Run(new Form1());
    }    
    
[/code]

となっていて、`Form1`コンストラクタが完了してから`Application.Run()`が実行されます。UI処理（メッセージループ）はこの中で動きます。

* * *

>
> 質問ですがform_load関数にて以下のような関数の中にawaitがあるにもかかわらず関数の外ににもawaitを書かなないといけない理由がはなんでしょうか?

その理由もradianさんの回答にある[非同期プログラミングのベスト プラクティス](https://learn.microsoft.com/ja-
jp/archive/msdn-magazine/2013/march/async-await-best-practices-in-
asynchronous-programming)で説明されています。とりあえず`async`メソッドを呼び出す際は
**常に**`await`を付けてください。（そして呼び出し元が`await`できるようにするためにはメソッド定義として`async
void`を避ける必要があります。）

* * *

[WinForms アプリでの WebView2 の使用を開始する / 手順 10 - ホストと Web
コンテンツ間の通信](https://learn.microsoft.com/ja-jp/microsoft-edge/webview2/get-
started/winforms#step-10---communication-between-host-and-web-content)に

>
[code]

>     public Form1()
>     {
>        InitializeComponent();
>        this.Resize += new System.EventHandler(this.Form_Resize);
>        webView.NavigationStarting += EnsureHttps;
>        InitializeAsync();
>     }
>  
>     async void InitializeAsync()
>     {
>        await webView.EnsureCoreWebView2Async(null);
>     }
>  
[/code]

このようなコードが載っていて、これを参考にされていたんですね。残念ながら、このサンプルコードは非同期プログラミングのベスト
プラクティスにも準じておらず正しくないコードです。


CC BY-SA 4.0
2022-11-23T09:10:14.437
92394
2022-11-24T22:57:55.073
2022-11-24T22:57:55.073
4236
4236
92393
answer