Opérations inter thread inter class / exécuter procédure sur le thread principal
Bonjour à toutes et tous,
Pardon d'avance si la terminologie employée est impropre (juriste de profession).
Débutant, je développe à l'aide de visualstudio une petite appli sur la base du navigateur cefsharp de consultations de bases environnementales et de génération de pdf (pour qu'ils soient annexés à des actes notariés électroniques).
Mon Application Winforms (Class Form1) lors d'un évènement javascript onclick appelle une procédure dans une seconde class (Class Bound) qui elle même appelle une procédure de ma form1 (en fait, je désactive un bouton impression d'une page web et j'attribue à ce bouton un évènement javascript onclick à partir duquel je veux lancer une procédure de création d'un fichier PDF (une impression pdf de la page web).
Mon souci est que cette dernière procédure (création d'un pdf) qui est sur Form1 s'exécute non dans le thread principal mais dans le thread de travail de ma procédure d'appel de la seconde class, ce qui provoque des exceptions 'System.NullReferenceException' dans mon appli.
DANS FORM 1
Code:
1 2 3 4 5 6 7 8 9
| Browser = New ChromiumWebBrowser("https://www.geoportail.gouv.fr/carte?c=3.164349169221308,46.82989009658934&z=6&l0=DGAC-PEB_BDD_FXX_WM_WMS::GEOPORTAIL:OGC:WMS(1)&l1=GEOGRAPHICALGRIDSYSTEMS.MAPS.3D::GEOPORTAIL:OGC:WMTS==aggregate(0.2265625)&permalink=yes") With {
.Dock = DockStyle.Fill
}
CefSharpSettings.LegacyJavascriptBindingEnabled = True
CefSharpSettings.WcfEnabled = True
Dim obj As New BoundObject()
Browser.JavascriptObjectRepository.Register("bound", obj, True, BindingOptions.DefaultBinder) |
PUIS L'EVENNEMENT JAVASCRIPT
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
Private Sub Browser_LoadingStateChanged(sender As Object, e As LoadingStateChangedEventArgs) Handles Browser.LoadingStateChanged
path1 = Application.StartupPath & "\temp\" & utilisateur & "\geoportail01.pdf"
Dim jsScript As String = ""
jsScript = <js><![CDATA[
document.getElementById('print-comment').disabled=true;
document.getElementById('print-submit').value='Imprimer';
var element = document.getElementById('print-submit');
element.type = "button";
element.onclick = function (){bound.onClicked(window.getSelection().toString());};
]]></js>
Browser.ExecuteScriptAsync(jsScript)
(...)
End Sub |
LE DEBUT DE LA PROCEDURE DE CREATION DU PDF
Code:
1 2 3 4 5 6 7
|
Public Async Sub PDF_Click()
Dim source As String = Await Browser.GetBrowser().MainFrame.GetSourceAsync()
(...) |
ENFIN MA CLASS BOUNDOBJECT
Code:
1 2 3 4 5 6 7 8 9
| Public Class BoundObject
Friend browser As ChromiumWebBrowser
Public Sub OnClicked(ByVal selected As String)
Form1.PDF_Click()
End Sub
End Class |
J'ai essayé de lancer Form1.PDF_Click() au moyen d'un délégué sur ma FORM 1 mais rien à faire Form1.PDF_Click() ne s'éxécute pas dans mon thread principal.
Je suis perdu, je ne comprends pas comment procéder pour exécuter Form1.PDF_Click() dans le thread principal si appelé de mon autre class.
Il existe surement une autre méthode pour déclencher une procédure à partir d'un évènement javascript sans passer par une class secondaire ou mais je n'ai pas trouvé/compris dans mes lectures.
Merci pour l'aide que vous pourrez m'apporter.