Visual Basic .NET Language
Threading
Zoeken…
Thread-safe oproepen uitvoeren met Control.Invoke ()
Met de methode Control.Invoke()
kunt u de uitvoering van een methode of functie verplaatsen van een achtergrondthread naar de thread waarop het besturingselement is gemaakt, meestal de thread UI (User Interface). Hierdoor wordt uw code in de wachtrij geplaatst om in plaats daarvan op de thread van het besturingselement te worden uitgevoerd, waardoor de mogelijkheid van gelijktijdigheid wordt verwijderd.
De eigenschap Control.InvokeRequired
moet ook worden aangevinkt om te bepalen of u een beroep moet doen of dat de code al op dezelfde thread wordt uitgevoerd als het besturingselement.
De methode Invoke()
neemt een gemachtigde als eerste parameter. Een gedelegeerde houdt de referentie, parameterlijst en het retourtype naar een andere methode.
In Visual Basic 2010 (10.0) of hoger kunnen lambda-expressies worden gebruikt om direct een delegatiemethode te maken:
If LogTextBox.InvokeRequired = True Then
LogTextBox.Invoke(Sub() LogTextBox.AppendText("Check passed"))
Else
LogTextBox.AppendText("Check passed")
End If
Terwijl u in Visual Basic 2008 (9.0) of lager de gedelegeerde zelf moet aangeven:
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
Threads-safe bellen met Async / Await
Als we proberen een object op de UI-thread te wijzigen van een andere thread, krijgen we een uitzondering voor de threadoverschrijdende bewerking:
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
Vóór VB 14.0 en .NET 4.5 riep de oplossing de toewijzing op en object levend op de UI-thread:
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
Met VB 14.0 kunnen we een Task
op een andere thread uitvoeren en vervolgens de context herstellen zodra de uitvoering is voltooid en vervolgens de opdracht uitvoeren met 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