Ето един съкратен пример за това как да правите асинхронна работа с VB.Net 4.0.
Нека си представим, че имате формуляр, който има следните импортирания,
Imports System.Windows.Forms
Imports System.Threading
Imports System.Threading.Tasks
Този формуляр има две контроли
Private WithEvents DoSomthing As Button
Private WithEvents Progress As ProgressBar
Някъде във вашето приложение имаме Function
наречен ExecuteSlowStuff
, тази функция е еквивалент на вашия executeMyQuery
. Важната част е Action
параметър, който функцията използва, за да покаже, че напредва.
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
Да кажем, че тази работа започва с щракване върху DoSomething
Button
.
Private Sub Start() Handled DoSomething.Click
Dim slowStuff = Task(Of Integer).Factory.StartNew(
Function() ExceuteSlowStuff(AddressOf Me.ShowProgress))
End Sub
Вероятно се чудите къде е ShowProgress
идва от, това е по-обърканото.
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
Имайте предвид, че тъй като ShowProgress
може да бъде извикан от друга нишка, той проверява за кръстосани извиквания на нишка. В този случай той се извиква в основната нишка.