Aqui está um exemplo reduzido de como fazer trabalho assíncrono com VB.Net 4.0.
Vamos imaginar que você tenha um formulário que tenha as seguintes importações,
Imports System.Windows.Forms
Imports System.Threading
Imports System.Threading.Tasks
Esse formulário tem dois controles
Private WithEvents DoSomthing As Button
Private WithEvents Progress As ProgressBar
Em algum lugar em seu aplicativo, temos uma
Function
chamado ExecuteSlowStuff
, esta função é equivalente ao seu executeMyQuery
. A parte importante é a Action
parâmetro que a função usa para mostrar que está progredindo. 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
Digamos que este trabalho seja iniciado pelo clique do botão
DoSomething
Button
. Private Sub Start() Handled DoSomething.Click
Dim slowStuff = Task(Of Integer).Factory.StartNew(
Function() ExceuteSlowStuff(AddressOf Me.ShowProgress))
End Sub
Você provavelmente está se perguntando onde
ShowProgress
vem, essa é a parte mais confusa. 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
Observe que, como
ShowProgress
pode ser invocado de outro encadeamento, ele verifica as chamadas entre encadeamentos. Nesse caso, ele invoca a si mesmo no thread principal.