Her er et nedskæringseksempel på, hvordan man udfører asychrounous arbejde med VB.Net 4.0.
Lad os forestille os, at du har en formular, der har følgende importer,
Imports System.Windows.Forms
Imports System.Threading
Imports System.Threading.Tasks
Denne formular har to kontroller
Private WithEvents DoSomthing As Button
Private WithEvents Progress As ProgressBar
Et eller andet sted i din ansøgning har vi en Function
kaldet ExecuteSlowStuff
, denne funktion svarer til din executeMyQuery
. Den vigtige del er Action
parameter, som funktionen bruger til at vise, at den gør fremskridt.
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
Lad os sige, at dette arbejde startes ved at klikke på DoSomething
Button
.
Private Sub Start() Handled DoSomething.Click
Dim slowStuff = Task(Of Integer).Factory.StartNew(
Function() ExceuteSlowStuff(AddressOf Me.ShowProgress))
End Sub
Du undrer dig sikkert over, hvor ShowProgress
kommer fra, det er den mere rodede smule.
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
Bemærk, at fordi ShowProgress
kan påberåbes fra en anden tråd, tjekker den for krydstrådskald. I så fald kalder den sig selv på hovedtråden.