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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow