Hier is een kort voorbeeld van hoe u asychrounaal werk kunt doen met VB.Net 4.0.
Stel je voor dat je een formulier hebt met de volgende invoer,
Imports System.Windows.Forms
Imports System.Threading
Imports System.Threading.Tasks
Dat formulier heeft twee besturingselementen
Private WithEvents DoSomthing As Button
Private WithEvents Progress As ProgressBar
Ergens in je applicatie hebben we een Function
genaamd ExecuteSlowStuff
, deze functie is het equivalent van uw executeMyQuery
. Het belangrijkste onderdeel is de Action
parameter die de functie gebruikt om te laten zien dat het vooruitgang boekt.
Private Shared Function ExecuteSlowStuff(ByVal progress As Action) As Integer
Dim result = 0
For i = 0 To 10000
result += i
Thread.Sleep(500)
progress()
Next
Return result
End Function
Laten we zeggen dat dit werk wordt gestart door de klik op de DoSomething
Button
.
Private Sub Start() Handled DoSomething.Click
Dim slowStuff = Task(Of Integer).Factory.StartNew(
Function() ExceuteSlowStuff(AddressOf Me.ShowProgress))
End Sub
Je vraagt je waarschijnlijk af waar ShowProgress
vandaan komt, dat is het rommeligere deel.
Private Sub ShowProgress()
If Me.Progress.InvokeRequired Then
Dim cross As new Action(AddressOf Me.ShowProgress)
Me.Invoke(cross)
Else
If Me.Progress.Value = Me.Progress.Maximum Then
Me.Progress.Value = Me.Progress.Minimum
Else
Me.Progress.Increment(1)
End If
Me.Progress.Refresh()
End if
End Sub
Merk op dat omdat ShowProgress
kan worden aangeroepen vanuit een andere thread, het controleert op cross-thread-oproepen. In dat geval roept het zichzelf op in de hoofdthread.