Visual Basic .NET Language
Filetage
Recherche…
Effectuer des appels thread-safe à l'aide de Control.Invoke ()
À l'aide de la méthode Control.Invoke()
, vous pouvez déplacer l'exécution d'une méthode ou d'une fonction d'un thread d'arrière-plan vers le thread sur lequel le contrôle a été créé, à savoir le thread d'interface utilisateur. Ce faisant, votre code sera mis en file d'attente pour s'exécuter sur le thread du contrôle à la place, ce qui supprime la possibilité de simultanéité.
La propriété Control.InvokeRequired
doit également être vérifiée afin de déterminer si vous devez appeler ou si le code s'exécute déjà sur le même thread que le contrôle.
La méthode Invoke()
prend un délégué comme premier paramètre. Un délégué détient la référence, la liste de paramètres et le type de retour dans une autre méthode.
Dans Visual Basic 2010 (10.0) ou supérieur, les expressions lambda peuvent être utilisées pour créer une méthode de délégation à la volée:
If LogTextBox.InvokeRequired = True Then
LogTextBox.Invoke(Sub() LogTextBox.AppendText("Check passed"))
Else
LogTextBox.AppendText("Check passed")
End If
Considérant que dans Visual Basic 2008 (9.0) ou inférieur, vous devez déclarer le délégué vous-même:
Delegate Sub AddLogText(ByVal Text As String)
If LogTextBox.InvokeRequired = True Then
LogTextBox.Invoke(New AddLogText(AddressOf UpdateLog), "Check passed")
Else
UpdateLog("Check passed")
End If
Sub UpdateLog(ByVal Text As String)
LogTextBox.AppendText(Text)
End Sub
Effectuer des appels sécurisés avec Async / Await
Si nous essayons de changer un objet sur le thread d'interface utilisateur à partir d'un thread différent, nous aurons une exception d'opération croisée:
Private Sub Button_Click(sender As Object, e As EventArgs) Handles MyButton.Click
' Cross thread-operation exception as the assignment is executed on a different thread
' from the UI one:
Task.Run(Sub() MyButton.Text = Thread.CurrentThread.ManagedThreadId)
End Sub
Avant VB 14.0 et .NET 4.5, la solution invoquait l'affectation et l'objet vivant sur le thread d'interface utilisateur:
Private Sub Button_Click(sender As Object, e As EventArgs) Handles MyButton.Click
' This will run the conde on the UI thread:
MyButton.Invoke(Sub() MyButton.Text = Thread.CurrentThread.ManagedThreadId)
End Sub
Avec VB 14.0 , nous pouvons exécuter une Task
sur un thread différent, puis restaurer le contexte une fois l'exécution terminée, puis effectuer l'assignation avec Async / Await:
Private Async Sub Button_Click(sender As Object, e As EventArgs) Handles MyButton.Click
' This will run the code on a different thread then the context is restored
' so the assignment happens on the UI thread:
MyButton.Text = Await Task.Run(Function() Thread.CurrentThread.ManagedThreadId)
End Sub