Mazliet par pavedieniem (threads) un VB.NET. Kopš .net CLR un CIL parādīšanās pavedieni vairs nav tikai "izvirtība priekš C++ programmētājiem" — tā ir arī ērti pieejama izvirtība VB programmētājiem.
Pirmkārt — kāpēc gan niekoties ar pavedieniem, ja viss tāpat jau darbojas? Viens no vienkāršākajiem pielietojumiem — ir vajadzīga aplikācija ar lietotāja interfeisu, kas paredzēta nepacietīgam cilvēkam, kuram neder, ka ineterfeiss "bremzē", bet ir nepieciešams veikt darbības, kuras aizņem daudz laika, kuras turklāt nav pārtraucamas. Piemēram, varam iedomāties aplikāciju, kas pār HTTP savienojumu ielādē ierakstus kādā listbox vai tamlīdzīgā kontrolē (kaut vai e-pasta vēstules, kas pa vienai parādās sarakstā). Kamēr dati lādējas, lietotājam varētu ļaut darīt arī kaut ko citu (piemēram, pakustināt formu).
Iedomājamies, ka ir nepieciešams ielādēt datus no HTTP, bet tajā laikā GUI jābūt brīvi pieejamam.
Datus varam dabūt ar šādu metodi
Dim o As System.Net.HttpWebRequest
o = System.Net.WebRequest.Create("http://www.asdf.lv/")
Dim sText As String = New System.IO.StreamReader( _
o.GetResponse.GetResponseStream()).ReadToEnd
return sText
End Function
Ko darīt. Izveidojam jaunu "darbinieka" klasi, kas veiks vajadzīgo darbu:
Public Event DataLoaded(ByVal result As String)
Public Sub GetIt()
Dim o As System.Net.HttpWebRequest
o = System.Net.WebRequest.Create("http://www.asdf.lv/")
Dim sText As String = New System.IO.StreamReader( _
o.GetResponse.GetResponseStream()).ReadToEnd
RaiseEvent DataLoaded(sText)
End Sub
End Class
Ko darīt īpašniekam? Pieņemam, ka īpašnieks ir Windows forma, kurā nepieciešams ielādēt datus. Formai pirmkārt nepieciešama privāta izpildītāja klases instance.
Vēl nepieciešams deklarēt pašu pavedienu. To var izdarīt ar sekojošu rindu:
Public WithEvents loaders As loader
Public myThread As System.Threading.Thread
Private Sub Button1Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
loaders = New loader()
myThread = New System.Threading.Thread(AddressOf loaders.GetIt)
myThread.Start() `sākas patiesā ielāde
End Sub
Private Sub loadersa(ByVal result As String) _
Handles loaders.DataLoaded
Me.TextBox1.Text = result
End Sub
End Class
Šeit arī redzams, ka, nospiežot pogu button1 tiek izveidota jauna pavediena instance, kurai tiek nodota izpildāmās metodes adrese. Šajā gadījumā tiek izmantota klases instances metode, bet tikpat labi metode varēja būt arī statiska.
Pēc tam pavediens tiek palaists darbā (un forma aizmirst par to, ka tas darbojas).
Vēlāk tiek apstrādāts notikums, ko radījusi ielādes klase – dati ir ielādēti.