Bonjour à tous,

Pour mettre à jour des cours, mon programme lit des pages web pour en extraire les données qui m’intéressent, puis faire la mise à jour d’une base historique des cotations. L’inconvénient de ma solution utilisant un WebBrowser est le blocage de l’interface Form pendant toute la durée de l’opération. J’aurai aimé que celle-ci se fasse en background sans déranger l’utilisateur .

J’ai donc réalisé une sub serveur dans le programme principal, quatre thread clients communiquant par pipes avec ce serveur, pour obtenir les références des données à chercher, puis demander les pages correspondantes et enfin renvoyer les données téléchargées.

Je pensais ainsi résoudre ce blocage de l’interface utilisateur ! et bien NON

Existe il une solution pour que l’asynchronisme des processus client et serveur garantisse le non blocage de l’interface ?

La consommation cpu est inférieure à 5%, merci de vos conseils.



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
la fonction serveur :
 
Dim pipeServer_1 As New NamedPipeServerStream("pipe_isin_url_1", PipeDirection.Out, 4, PipeTransmissionMode.Byte, PipeOptions.Asynchronous)
 
premier_thread()
pipeServer_1.WaitForConnection()
Dim ecrire_pipe_1 As New StreamWriter(pipeServer_1)
 
ecrire_pipe_1.WriteLine(isin_titre(index_titre) + url_0_titre(index_titre))
ecrire_pipe_1.Close()
 
la définition du thread :
 
    Public Sub New(ByVal index_thread As Integer)
        thread_index = index_thread
 
    End Sub
 
    Private Sub premier_thread()
        Dim extraire_1 As New clsThread(1)
 
        Dim lire_un_cours As New Thread(AddressOf extraire_1.cotation)
        lire_un_cours.IsBackground = True
        lire_un_cours.Start()
 
    End Sub
 
la classe client cotation,
 
Public Sub cotation()
 
Dim web_serveur As New System.Net.WebClient(), codeHTML As String, From_code As encoding
Dim pipeClient As New NamedPipeClientStream(".", "pipe_isin_url_" + thread_index.ToString,         PipeDirection.In, PipeOptions.Asynchronous)
 
pipeClient.Connect()
Dim lire_pipe As New StreamReader(pipeClient)
 
url_demande = lire_pipe.ReadLine()
Dim page_html As New StreamReader(web_serveur.OpenRead(url_demande), From_code)
codeHTML = page_html.ReadToEnd()
 
End Sub