Buonasera,
volevo chiedere aiuto sul come risolvere questo problema: nel mio programma uso un Webview2, carico un indirizzo e chiedo di navigare a tale pagina.. Non avendo proprieta da testare direttamente per sapere quando è caricata la pagina, prima di estrarne elementi con Javascript, uso l'evento asincrono “navigation completed” per impostare un flag booleano che viene testato dentro un loop.
Con un timer attendo massimo 30 sec prima di avere conferma dell'avvenuto caricamento pagina, oppure informo del problema se il timer scade.
Dentro il loop che controlla lo stato del flag impostato da “navigation completed” ho messo un msgbox: se lo attivo, tutta la sequenza funziona e riesco a navigare alla pagina, impostare il flag caricamento avvenuto (ovviamente prima dei 30 sec), ed in seguito estraggo dati dalla pagina..
Ma se ometto la riga con msgbox, il tutto si blocca in un loop infinito.. Non avendo esperienza sulla programmazione asincrona, e non avendo una proprietà di wv2 da testare per sapere se la pagina è caricata, ho provato con questa tecnica, che va a buon fine se c'e' la riga msgbox. In caso contrario si blocca tutto. Qualche suggerimento, anche alternativo a quanto pensato da me, per risolvere il problema? Non posso confermare a mano ogni volta..
C'e' da aggiungere da qualche parte qualcosa come DoEvents o simili per assicurare il navigation completed ed impedire il loop infinito?
Grazie!
*********************
dim tempo_scaduto as boolean = false ' flag 30 secondi passati
dim stato as boolean = false ' flag di avvenuto caricamento pagina
Sub naviga_alla_pagina(pagina As String)
'naviga
wv2.Source = New Uri(pagina)
End Sub
Private Async Sub wv2_NavigationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs) Handles wv2.NavigationCompleted
'imposta il flag che dice se la pagina è stata caricata positivamente
stato = True
'resetta timer
'timer_30sec.Enabled = False
End Sub
Sub attendi_caricamento_pagina()
'attendo al massimo 30 secondi che la pagina venga caricata, e se non succede informo del problema
timer_30sec.Enabled = True
Do While tempo_scaduto = False
'test only -- MsgBox(Now.Second)
MsgBox(Now.Second) ' se ometto questa istruzione, il sistema va in loop indeterminato
'controllo che un flag di avvenuto caricamento pagina web sia stato impostato dall'evento Navigation completed del Webview2
If stato = True Then
timer_30sec.Enabled = False
Exit Sub
End If
Loop
End Sub
Private Sub timer_30sec_Tick(sender As Object, e As EventArgs) Handles timer_30sec.Tick
'se è scaduto il tempo di 30 secondi e non è stata caricata la pagina, imposto un flag errore
tempo_scaduto = True
MsgBox("tempo scaduto, il caricamento non è stato possibile!")
timer_30sec.Enabled = False
End Sub