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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow