Sök…


Utför tråd-säkra samtal med Control.Invoke ()

Med hjälp av Control.Invoke() -metoden kan du flytta körningen av en metod eller funktion från en bakgrundstråd till tråden som kontrollen skapades på, vilket vanligtvis är UI (User Interface) -tråden. Genom att göra det kommer din kod att stå i kö för att köras på kontrollens tråd istället, vilket tar bort möjligheten för samtidighet.

Control.InvokeRequired bör också kontrolleras för att avgöra om du måste åberopa, eller om koden redan körs på samma tråd som kontrollen.

Metoden Invoke() tar en delegat som sin första parameter. En delegat har referens, parameterlista och returtyp till en annan metod.

I Visual Basic 2010 (10.0) eller högre kan lambda-uttryck användas för att skapa en delegatmetod i farten:

If LogTextBox.InvokeRequired = True Then
    LogTextBox.Invoke(Sub() LogTextBox.AppendText("Check passed"))
Else
    LogTextBox.AppendText("Check passed")
End If

Medan Visual Basic 2008 (9.0) eller lägre måste du själv förklara delegaten:

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

Utför tråd-säkra samtal med Async / Await

Om vi försöker ändra ett objekt på UI-tråden från en annan tråd får vi ett undantag för tvärtrådad operation:

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

Innan VB 14.0 och .NET 4.5 åberopade lösningen uppdraget och objektet som lever på UI-tråden:

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

Med VB 14.0 kan vi köra en Task på en annan tråd och sedan få sammanhanget återställt när exekveringen är klar och sedan utföra uppdraget med 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow