Een van de aanpassingen die binnen Visual Basic 11 zijn doorgevoerd ter ondersteuning van het asynchroon programmeren zijn Iterators. Iterators hebben tot doel om al gedurende een For Each – loop een bepaal resultaat al terug te pushen, zodat de aanroepende code er al vast mee aan de slag kan. Bekijk onderstaande code eens. Het zijn een tweetal procedures. De eerste procedure roept de methode BepaalTeVerwerkenBestanden() aan en doorloopt het resultaat van de functie; namelijk elk tekstbestand in de folder C:\. Dit is code zoals je die misschien vandaag de dag ook zou kunnen schrijven.

  1: Private Sub VerwerkBestanden()
  2: 
  3:   For Each bestandsNaam In BepaalTeVerwerkenBestanden()
  4:     ' Verwerk bestandsnaam
  5:   Next
  6: 
  7: End Sub
  8: 
  9: Private Function BepaalTeVerwerkenBestanden() As List(Of String)
 10: 
 11:   Dim teVerwerkenBestanden As New List(Of String)
 12: 
 13:   For Each bestandsNaam In System.IO.Directory.GetFiles("c:\", "*.txt") 
 14:     teVerwerkenBestanden.Add(bestandsNaam)
 15:   Next
 16: 
 17:   Return teVerwerkenBestanden
 18: 
 19: End Function

Het nadeel van deze manier van werken – en we weten eigenlijk ook niet anders – is dat de aanroepende procedure pas kan beginnen met het verwerken van de bestanden wanneer de hele lijst is opgebouwd. Logischerwijs zou men ook best kunnen veronderstellen dat wanneer de methode BepaalTeVerwerkenBestanden() het eerste bestand heeft bepaald, zij deze al teruggeeft aan de aanroepende procedure, zodat deze kan beginnen met verwerken. Dit resultaat kan men met Visual Basic 11 bereiken door gebruik te maken van Iterators en met name het nieuwe keyword: Yield. Yield betekent iets zoals teruggeven of overgeven.

  1: Private Sub VerwerkBestanden()
  2: 
  3:   For Each bestandsNaam In BepaalTeVerwerkenBestandenIterator()
  4:     ' Verwerk bestandsnaam
  5:   Next
  6: 
  7: End Sub
  8: 
  9: Private Iterator Function BepaalTeVerwerkenBestandenIterator() As IEnumerable(Of String)
 10: 
 11:   For Each bestandsNaam In System.IO.Directory.EnumerateFiles("c:\", "*.txt") 
 12:     Yield bestandsNaam
 13:   Next
 14: 
 15: End Function

Een Iterator function declareer je door het keyword Iterator toe te voegen aan de functiedeclaratie. Daarnaast moet je zorgen dat het returntype een IEnumarable of een IEnumetable(Of…) is. Omdat wij in onze functie een lijst met bestandsnamen willen teruggeven, kiezen we hier dus voor een IEnumerable(Of String). Vervolgens gebruiken we het keyword Yield om de bestandsnaam – één voor één – terug te geven. Om nog een betere performance te krijgen gebruiken we ook de Iterator-variant van de methode GetFiles(), namelijk EnumerateFiles(). Iterators kunnen je helpen om je code responsiever te krijgen; met name in omgevingen waar ook data vanaf het Internet geconsumeer wordt, en dus gedownload moet worden, kan het waarde zeker bewijzen.

Meer informatie: MSDN

Happy coding!

André