Bonjour,

J'ai fait plusieurs essais pour fermer une fenêtre d'information d'attente d'un thread principal qui est lancé au démarrage d'une instance.

La fenêtre d'information d'attente est ouverte avec l'événement System.Timers.Elapsed.

J'ai donc utilisé un Timer pour différer l'ouverture du message d'attente au cas ou le serveur est "busy".

Mais cette fenêtre ne peut plus être fermée avec un simple Form.Close(). La commande est bien parcourue au débogage mais

celle-ci refuse de se fermer.

Ok, j'ai lu que le Timer s’exécute sur un autre Thread donc comme c'est "Cloisonné" pas d'issue possible.

J'ai essayé ensuite d'utiliser la méthode Invoke avec Delegate mais je ne suis pas du tout satisfait du résultat car avec la récursivité du Sub, la fenêtre "mouline" et se ferme enfin quand même au bout de 20 à 30 s : cela fait un peu tâche !

J'ai de nouveau essayé avec le lancement de la commande Application.Run(New Form). La fenêtre d'attente s'ouvre bien à

l'aide du Timer. Et Surprise, lorsque je lance la commande Application.Exit() : je reste sur le Thread principal, la fenêtre

se ferme tout de suite et tout fonctionne bien mais je ne sais pas plus pourquoi et si la méthode est "propre" ?

Premier code avec la fenêtre qui ne se ferme pas du tout (Je n'ai pas mis de code pour la "form" Proxytest car elle ne

fait qu'afficher un bandeau et du texte dans un label pour l'attente:
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
43
44
45
46
47
48
49
50
51
52
53
Imports System.Timers

Module Routine

Private Temps As Timer
Private ProxTim as boolean

Public Function IntProx() As Boolean
  Dim adrtest As String = "http://www.example.com"        
  Try
     prox = WebRequest.GetSystemWebProxy()
     AdrProxy = prox.GetProxy(New Uri(adrtest))
     proxyObject = New WebProxy(AdrProxy, True)
     proxyObject.UseDefaultCredentials = True
     request = WebRequest.Create(adrtest)
     request.Timeout = 60000
     request.Proxy = proxyObject
     ProxTim= True
     Temps = New Timer()
     Temps.Interval = 1500
     Temps.Enabled = True
     Temps.Start()
     AddHandler Temps.Elapsed, AddressOf OnTimedEvent
     ReponseReq = CType(request.GetResponse, HttpWebResponse)
     If ReponseReq.StatusCode = HttpStatusCode.OK Then
           Temps.Enabled = False
           Temps.Dispose()
           Return False
     End If
Catch ex As WebException       
      If CType(ex.Response, HttpWebResponse).StatusCode = HttpStatusCode.ProxyAuthenticationRequired Then
           temps2.Enabled = False : temps2.Dispose()
           Return True                 
       End If
Finally
      If Not ProxTim Then Proxytest.close()      
End Try      
End Function

Public Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs)
        If ProxTim Then
            ProxTim =False
	    Temps.Stop()
            ProxyTest.Show()
            ProxyTest.Refresh()
        End If     
End Sub
End Module

Public Class ProxyTest
    ' Il n'y a pas de code utilisateur dans la classe ce n'est que de l'affichage de textes"
End Class
Deuxième essai après le premier essai qui ne permet pas la fermeture de la fenêtre d'information ProxyTest en essayant de
déléguer la fermeture :

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Imports System.Timers

Module Routine

Private Temps As Timer
Private ProxTim as boolean

Public Function IntProx() As Boolean
  Dim adrtest As String = "http://www.example.com"        
  Try
     prox = WebRequest.GetSystemWebProxy()
     AdrProxy = prox.GetProxy(New Uri(adrtest))
     proxyObject = New WebProxy(AdrProxy, True)
     proxyObject.UseDefaultCredentials = True
     request = WebRequest.Create(adrtest)
     request.Timeout = 60000
     request.Proxy = proxyObject
     ProxTim= True
     Temps = New Timer()
     Temps.Interval = 1500
     Temps.Enabled = True
     Temps.Start()
     AddHandler Temps.Elapsed, AddressOf OnTimedEvent
     ReponseReq = CType(request.GetResponse, HttpWebResponse)
     If ReponseReq.StatusCode = HttpStatusCode.OK Then
           Temps.Enabled = False
           Temps.Dispose()
           Return False
     End If
Catch ex As WebException       
      If CType(ex.Response, HttpWebResponse).StatusCode = HttpStatusCode.ProxyAuthenticationRequired Then
           temps2.Enabled = False : temps2.Dispose()
           Return True                 
       End If
Finally
       If Not ProxTim Then Proxytest.CloseForm()
      
End Try      
End Function

Public Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs)
        If ProxTim Then
            ProxTim =False
	    Temps.Stop()
            ProxyTest.Show()
            ProxyTest.Refresh()
        End If     
End Sub
End Module


Public Class ProxyTest
    Private Delegate Sub Clsfrm() 
    Public Sub CloseForm()
        If Me.InvokeRequired Then
            Me.Invoke(New Clsfrm(AddressOf CloseForm), New Object() {})
        Else
            Me.Close()
        End If
    End Sub
End Class
Et enfin, le dernier essai qui semble fonctionner parfaitement ? :

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
43
44
45
46
47
48
49
50
51
52
53
Imports System.Timers

Module Routine

Private Temps As Timer
Private ProxTim as boolean

Public Function IntProx() As Boolean
  Dim adrtestAs String = "http://www.example.com"        
  Try
     prox = WebRequest.GetSystemWebProxy()
     AdrProxy = prox.GetProxy(New Uri(adrtest))
     proxyObject = New WebProxy(AdrProxy, True)
     proxyObject.UseDefaultCredentials = True
     request = WebRequest.Create(adrtest)
     request.Timeout = 60000
     request.Proxy = proxyObject
     ProxTim= True
     Temps = New Timer()
     Temps.Interval = 1500
     Temps.Enabled = True
     Temps.Start()
     AddHandler Temps.Elapsed, AddressOf OnTimedEvent
     ReponseReq = CType(request.GetResponse, HttpWebResponse)
     If ReponseReq.StatusCode = HttpStatusCode.OK Then
           Temps.Enabled = False
           Temps.Dispose()
           Return False
     End If
Catch ex As WebException       
      If CType(ex.Response, HttpWebResponse).StatusCode = HttpStatusCode.ProxyAuthenticationRequired Then
           temps2.Enabled = False : temps2.Dispose()
           Return True                 
       End If
Finally     
      If Not ProxTim Then Application.Exit()
      
End Try      
End Function

Public Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs)
        If ProxTim Then
            ProxTim =False
	    Temps.Stop()
            Application.Run(New ProxyTest)
        End If     
End Sub
End Module


Public Class ProxyTest
End Class
Désolé pour mon message un peu long avec les trois "codes" mais je voulais mettre les trois variantes pour être le plus clair possible.

Merci d'avance pour votre aide !