Zde je stručný příklad toho, jak provádět Asychrounous Work s VB.Net 4.0.
Představme si, že máte formulář, který má následující importy,
Imports System.Windows.Forms
Imports System.Threading
Imports System.Threading.Tasks
Tento formulář má dva ovládací prvky
Private WithEvents DoSomthing As Button
Private WithEvents Progress As ProgressBar
Někde ve vaší aplikaci máme Function
s názvem ExecuteSlowStuff
, tato funkce je ekvivalentem vašeho executeMyQuery
. Důležitou součástí je Action
parametr, kterým funkce ukazuje, že postupuje.
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
Řekněme, že tato práce začíná kliknutím na DoSomething
Button
.
Private Sub Start() Handled DoSomething.Click
Dim slowStuff = Task(Of Integer).Factory.StartNew(
Function() ExceuteSlowStuff(AddressOf Me.ShowProgress))
End Sub
Pravděpodobně se ptáte, kde ShowProgress
pochází z, to je ten špinavější kousek.
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
Všimněte si, že protože ShowProgress
lze vyvolat z jiného vlákna, kontroluje volání napříč vlákny. V tom případě se sám vyvolá v hlavním vláknu.