Bonjour à tous !

La question parait simple mais la solution ne l'est pas !

Le problème :

Depuis le programme en VB démarrer un Task asynchrone (le Task est un .exe tiers)
puis le programme VB reviens à la ligne suivante qu'il exécute. Situation normal mais à ce niveau il faut créer un stand-by à l'exécution du code ci-dessous ! Et je ne trouve pas la solution !

A la question : Pourquoi lancer un thread asynchrone et vouloir attendre la fin du thread ? Ma réponse :

1/ Faire autre chose pendant l'exécution qui dure de 1s à plusieurs jours...
2/ Pouvoir arrêter le Task3 avec un bouton sur le form ou ToolStrip. Et donc ce bouton doit pouvoir être opérationel.

Divers solutions essayées sans trouver la solutions :

3/ Mettre un thread.sleep n’est pas la solution, car l’exécution suivant le cas peut prendre une seconde jusqu’à 3 jours avec un processeur I 9900!

4/ Mettre une boucle (do loop ou while wend) ne me permet plus d'arrêter le thread avec STOP le bouton n'est plus opérationel !

5/ Mettre un MsgBox ne va pas non plus car MsgBox est modale !

6/ Le programme ci-dessous en test. Le call FinModuleResolution() ci-dessous s’exécute sans attendre la fin de Task3 et rend la main sans les résultats escomptés. Si j’enlève le Call FinModuleResolution() ci-dessous je n’ai pas l’affichage des solutions trouvées !

Le but final de l’opération est d'utiliser FinModuleResolution() une fois que Task3 à donné ses résultats sur un fichier .txt puis l'afficher (donc Task3 à fini )


Le programme qui pose problème :

Sur le form il y a deux boutons un qu'on appel Résoudre et l'autre Stop


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
63
64
65
66
Public Async Sub Resoudre_Click(sender As Object, e As EventArgs) Handles Solve.Click
 
       Try
        'Lit les datas servi à Task 3 dans le fichier .txt
        Dim monStreamReader4 As New StreamReader(Disk + "\datainput.txt")
 
        Do Until monStreamReader4.Peek = -1 'si = -1 => jusqu'à la dernière ligne du fichier
            LecturemonStreamReader3 = monStreamReader4.ReadLine() + vbNewLine
            EnoncePopeyeBrut += LecturemonStreamReader3 
        Loop
        monStreamReader4.Close()
 
        Thread.Sleep(150)
 
        'résoud le problème ici, appel function task3() :
 
        Call New List(Of Task)().Add(Task.Run(AddressOf Task3))
        Await Task.WhenAll(New List(Of Task)())
 
        Thread.Sleep(150)
 
        'attend la fin de Task3
        Call New List(Of Task)().Add(Task.Run(AddressOf Task4))
        Await Task.WhenAll(New List(Of Task)())
        Thread.Sleep(150)
 
!!!!!! Il faut créer ici une instruction d'attente non modale vérifiant si buton stop est appuyé qui arrête Task3. !!!!!!!
 
Call FinModuleResolutionPopeye()
 
    Catch ex As Exception
     ‘…
    End Try
 
End Sub 
 
 Public Sub StopSolving_Click(sender As Object, e As EventArgs) Handles StopSolving.Click
     'Stop solving button in toolstrip head line. This sub work with the Sub StopSolving_MouseEnter !
     Try
         Dim qqq As Process = Process.GetProcessById(LeProcess1)
         qqq.Kill()
         Stop_solving.Visible = False
 
     Catch ex As Exception
     End Try
 
 End Sub
 
 Private Async Function Task3() As Task 'démarre pywin64.exe
 
     Using myProcess1 As New Process
         Try
 
             myProcess1.StartInfo.Arguments = vbNormalFocus
             myProcess1.StartInfo.FileName = Disk + "\pywin64.exe"
             myProcess1.StartInfo.Arguments = Disk + "\datainp.txt"
 
             'démarre l'exe
             LeProcess1 = Process.Start(myProcess1.StartInfo).Id
             Thread.Sleep(300)
 
         Catch ex As Exception
             MessageBox.Show(ex.Message & "Stack Trace: " & vbCrLf & ex.StackTrace)
         End Try
     End Using
     Await Task.WhenAll()
Il faut donc un point d’attente qui n’empêche pas de faire autre chose dans le programme ni d’arrêter le Task3 avec la touche STOP. Une fois le Task3 fini ce point d’attente est supprimé et le programme continu avec la lecture de FinModuleResolution()

Comment mettre un point d’attente? Point d’attente qui ne doit pas être 'modale' comme un MsgBox !

Il semble d'après la littérature que cela peut se faire en lançant le thread 3 et 4 et le thread 4 attends que thread 3 finisse mais je n'arrive pas à le mettre en pratique dans mon exemple ! Le lien : https://stackoverflow.com/questions/...ting-next-step

Si vous avez une idée?