Visual Basic .NET Language
Threading
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