Oto skrócony przykład wykonywania pracy asynchronicznej z VB.Net 4.0.
Wyobraźmy sobie, że masz formularz, który ma następujące importy,
Imports System.Windows.Forms
Imports System.Threading
Imports System.Threading.Tasks
Ten formularz ma dwie kontrolki
Private WithEvents DoSomthing As Button
Private WithEvents Progress As ProgressBar
Gdzieś w Twojej aplikacji mamy Function
o nazwie ExecuteSlowStuff
, ta funkcja jest odpowiednikiem Twojego executeMyQuery
. Ważną częścią jest Action
parametr, którego funkcja używa, aby pokazać, że robi postępy.
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
Powiedzmy, że ta praca jest rozpoczynana przez kliknięcie DoSomething
Button
.
Private Sub Start() Handled DoSomething.Click
Dim slowStuff = Task(Of Integer).Factory.StartNew(
Function() ExceuteSlowStuff(AddressOf Me.ShowProgress))
End Sub
Prawdopodobnie zastanawiasz się, gdzie ShowProgress
pochodzi z tego, co jest bardziej bałaganiarskie.
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
Zauważ, że ponieważ ShowProgress
może być wywoływany z innego wątku, sprawdza wywołania między wątkami. W takim przypadku wywołuje się w głównym wątku.