Hoi,
Ik ben al een paar dagen aan het experimenteren met de webview2 component in .NET
Meeste dingen lukken al aardig maar loop nu al een tijdje stuk op het opvragen van de html uit de DOM.
Er is nog geen native property in de webview component maar met een simpele js functie (document.documentElement.outerHTML) is deze wel opvraagbaar.
Probleem hiermee is dat de enige method om js uit te voeren in een webview component een async functie is, en de verschillende manieren om te wachten op het resultaat leveren of een infinite loop, of zelfs een program crash (zonder exception in de debugger...) op.
relevante code:
in dit geval komt ie nooit bij de //dosomething.
zelfs dit halfbakken experiment:
Wil de hh niet vullen
Ook diverse Task.wait et al experimentjes leverden niks op
Wat is de goede manier om te wachten op zo'n async functie? En nee, ik kan niet het hele spul async maken..
Ik ben al een paar dagen aan het experimenteren met de webview2 component in .NET
Meeste dingen lukken al aardig maar loop nu al een tijdje stuk op het opvragen van de html uit de DOM.
Er is nog geen native property in de webview component maar met een simpele js functie (document.documentElement.outerHTML) is deze wel opvraagbaar.
Probleem hiermee is dat de enige method om js uit te voeren in een webview component een async functie is, en de verschillende manieren om te wachten op het resultaat leveren of een infinite loop, of zelfs een program crash (zonder exception in de debugger...) op.
relevante code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| private void Form1_Load(object sender, EventArgs e) { webView.CoreWebView2InitializationCompleted += WebView_CoreWebView2InitializationCompleted; webView.Source = new Uri("https://npostart.nl/"); } private void WebView_CoreWebView2InitializationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e) { if (!e.IsSuccess) throw new Exception("init error"); webView.CoreWebView2.DOMContentLoaded += CoreWebView2_DOMContentLoaded; } private void CoreWebView2_DOMContentLoaded(object sender, Microsoft.Web.WebView2.Core.CoreWebView2DOMContentLoadedEventArgs e) { string html=GetDoc().Result; //do something } private async Task<String> GetDoc() { return await webView.CoreWebView2.ExecuteScriptAsync("document.documentElement.outerHTML"); } |
in dit geval komt ie nooit bij de //dosomething.
zelfs dit halfbakken experiment:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| private string hh = null; private void CoreWebView2_DOMContentLoaded(object sender, Microsoft.Web.WebView2.Core.CoreWebView2DOMContentLoadedEventArgs e) { GetDoc(); do { Application.DoEvents(); } while (hh == null); //do something } private async void GetDoc() { string html = await webView.CoreWebView2.ExecuteScriptAsync("document.documentElement.outerHTML"); hh = html; } |
Wil de hh niet vullen
Ook diverse Task.wait et al experimentjes leverden niks op
Wat is de goede manier om te wachten op zo'n async functie? En nee, ik kan niet het hele spul async maken..
Het grote voordeel van windows is dat je meer dos-boxen kan openen