Je voudrais faire de l'asynchrone pour lancer les traitement bdd, report ou autre qui bloquent l'écran.
Mais je me suis rendu compte que c pas si simple. Donc j'ai du me faire un petit example à part pour avoir une idée clair de la démarche :
1. déclarer une fonction delegate et la fonction même signature (TestDelegateSimple et FunctionAsynchroneSimple);
2. déclarer les Callback et beginInvoke (dans Sub Start) pour executer sur un autre thread
3. Récupérer les infos en fin de traitement du thread avec EndInvoke (dans Sub AsyncInfo)
4. Passage de paramètre et récupération des erreurs.
J'affiche dans me.Label1 le suivi du traitement. Il montre que l'on récupère bien les modifications faite dans la fonction asynchrone.
Ca marche mais je ne sais pas comment traiter 'proprement' les erreurs survenues dans le Thread asynchrone.
Je continue à chercher mais j'espère que l'un de vous pourra m'aider !
Source / Exemple :
Option Explicit On
Option Strict On
Public Class frmTestDelegate
Inherits System.Windows.Forms.Form
Public Delegate Function TestDelegateSimple(ByRef info As String) As InfoThread
#Region " Windows Form Designer generated code "
'Cette partie est dans le zip.
...
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Start()
Me.Label1.Text += vbCrLf + "Button1 Fini"
Dim i As Int32
Dim y As Int32 = 10000000
Me.Label1.Text += vbCrLf + " en attendant ..."
For i = 0 To y * 100
If i Mod y = 0 Then
Me.Label1.Text += " " + CStr(i / y)
Application.DoEvents()
End If
Next
End Sub
'lance le traitement asynchrone
Private Sub Start()
Dim cb As AsyncCallback = New AsyncCallback(AddressOf AsyncInfoEnd)
Dim d As TestDelegateSimple = New TestDelegateSimple(AddressOf FunctionAsynchroneSimple)
Dim infoEnter As String = "Debut Thread"
Dim i As InfoThread
Try
d.BeginInvoke(infoEnter, cb, "Deb")
Catch
Debug.Assert(False)
End Try
End Sub
'Les traitement asynchrones se font ici...
Shared Function FunctionAsynchroneSimple(ByRef info As String) As InfoThread
'Mais je ne sais pas récupérer les erreurs !!! HELP !!!
Try
'Ligne suivante pour provoquer une erreur :
'Dim tb As Int16() : ReDim tb(1) : tb(0) = 0 : tb(1) = 1 : tb(2) = 2
System.Threading.Thread.CurrentThread.Sleep(New TimeSpan(0, 0, 5))
'MessageBox.Show("terminé")
Dim iTh As New InfoThread()
ith.Texte = "Boucle asynchrone fini"
Return iTh
Catch ex As Exception
Dim ith As New InfoThread()
ith.ITException = ex
Return ith
End Try
'MsgBox(info)
End Function
'Function de fin de traitement.
Public Sub AsyncInfoEnd(ByVal ar As System.IAsyncResult)
If ar.CompletedSynchronously Then
'keskifé ?
ElseIf ar.IsCompleted Then
Dim value As String = Convert.ToString(ar.AsyncState)
Dim Async As System.Runtime.Remoting.Messaging.AsyncResult
Async = CType(ar, System.Runtime.Remoting.Messaging.AsyncResult)
Dim tmp As TestDelegateSimple = CType(Async.AsyncDelegate, TestDelegateSimple)
Dim result As InfoThread = tmp.EndInvoke("tmp", ar)
'ITException contient l'erreur survenue dans la fonction asynchrone.
If IsNothing(result.ITException) Then
Me.Label1.Text += vbCrLf + "IsCompleted : " + value + " -> " + result.Texte + vbCrLf
Else
Me.Label1.Text += vbCrLf + "IsCompleted : " + value + " -> " + result.ITException.ToString + vbCrLf
End If
'On peut ajouter des testes sur ar pour voir l'état du thread.
End If
End Sub
End Class
'Classe passée en param pour les infos du Thread.
Public Class InfoThread
Public Texte As String 'L'objet dont ont veut récupérer l'état et qui est long à répondre et que ça vaut le coup de se casser le c. de faire tout ça.
Public ITException As Exception 'ex survenue dans l'autre Thread.
End Class
Conclusion :
Gestion d'erreur "maison" ! C'est pas propre mais si qq1 a mieux ... je suis prenneur.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.