Threadi

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

Public Function 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
  return sText
End Function
Skaidrs ir tas, ka šī metode izpildīsies "uzreiz", tātad, ja savienojums būs lēns, UI tajā laikā neatjaunosies.
Ko darīt. Izveidojam jaunu "darbinieka" klasi, kas veiks vajadzīgo darbu:
Public Class loader
  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
Šī klase definē arī savu notikumu (event) — DataLoaded. Notikums iestāsies tad, kad dati būs ielādēti. Notikums arī palīdzēs nogādāt ielādētos datus no izpildītāja pie "īpašnieka".
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.
Public WithEvents loaders As loader
Šo instanci nevaram deklarēt tās metodes ķermenī, kura izsauks strādātājpavedienu, jo mēs taču ceram, ka metode izsauks ielādes procedūru un turpinās darbu. Tātad, iespējams, beigsies pirms strādātājpavediena metodes.
Vēl nepieciešams deklarēt pašu pavedienu. To var izdarīt ar sekojošu rindu:
Public myThread As System.Threading.Thread
. Nu, kas tad vēl atliek… pavediena inicializācija un datu ķeršana. Šeit arī kopējais formas kods (izņemot kontroļu ģenerācijas kodu)
Public Class Forma
  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 loaders
a(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.