Code Focused

Understanding Iterators: Concepts, Benefits and Functionality

Iterators are available for Visual Basic in Visual Studio 2010 after installing the latest Visual Studio Async CTP, and natively in Visual Basic 11.

Iterators in both C# and Visual Basic provide a simple mechanism to asynchronously consume the elements of a collection as they become available, rather than wait for the collection to be fully formed and then processed. Iterators provide a very easy-to-code method to improve application performance via asynchronous processing in the specific case of creating and consuming item collections.

Iterators clearly provide benefits when the collection takes too long to populate, and risks making the application seem unresponsive to the user. How long is too long? It depends on the application and developer preference, but Microsoft used 50 milliseconds (0.05 seconds) as the maximum expected response time when designing the WinRT methods for Windows 8. Any routine that could reasonably take longer than that was coded as an asynchronous method. Correspondingly, I recommend the use of iterators if it takes longer than 50 milliseconds to fully populate the collection in your application. If populating the collection takes significantly less than 50 milliseconds, then it may not be worth the slightly increased programming and runtime overhead to use iterators.

Iterators may also provide benefit when the individual collection item requires significant amounts of memory. By consuming each item as it becomes available, the application can avoid allocating memory for the full collection and any associated performance penalties.

Prior to iterators, an application would have had to invoke additional threads in order to perform asynchronous operations for a responsive user experience. That came at a heavy price in terms of additional programming complexity, enough that I completely avoided writing multi-threaded applications. Iterators don't invoke additional threads, and thus don't introduce the unwanted complexity.

If no additional threads are created, how do iterators provide a more responsive result? A somewhat simplified explanation is that wherever an iterator has an item ready for the calling method to process, the developer coded a Yield {collection item} statement. The compiler remembers the location of the Yield statement and the state of the iterator method, then provides the collection item specified in the Yield statement to the calling method.

When the calling statement requests the next element in the collection, the compiler resumes execution at the remembered location within the iterator and begins the process of forming the next collection item value. Note that this iterator processing is being performed by the compiler and is not a feature of the .NET Framework or the Common Language Runtime (CLR).

From the above description you can see that the time to complete processing of the full collection will require essentially the same amount of time as it would have without iterators (plus the slight overhead of switching execution flow), but that the individual elements are presented much faster. For example, an iterator function may return one item each second for a 10 item collection, rather than return all 10 items only after 10 seconds have elapsed as a standard function would have done.

Iterators have been available in C# since Visual Studio 2005 but are new to Visual Basic developers. The explanation in Part 1 of this article series applies equally for both C# and Visual Basic developers. In Part 2, I'll specifically explore Visual Basic iterator syntax, demonstrate Visual Basic iterator methods and properties, and compare Visual Basic iterators to C# iterators.

The Visual Studio Async CTP (Version 3) can be found at bit.ly/sVblDq.

About the Author

Joe Kunk is a Microsoft MVP in Visual Basic, three-time president of the Greater Lansing User Group for .NET, and developer for Dart Container Corporation of Mason, Michigan. He's been developing software for over 30 years and has worked in the education, government, financial and manufacturing industries. Kunk's co-authored the book "Professional DevExpress ASP.NET Controls" (Wrox Programmer to Programmer, 2009). He can be reached via email at [email protected].

comments powered by Disqus

Featured

  • Hands On: New VS Code Insiders Build Creates Web Page from Image in Seconds

    New Vision support with GitHub Copilot in the latest Visual Studio Code Insiders build takes a user-supplied mockup image and creates a web page from it in seconds, handling all the HTML and CSS.

  • Naive Bayes Regression Using C#

    Dr. James McCaffrey from Microsoft Research presents a complete end-to-end demonstration of the naive Bayes regression technique, where the goal is to predict a single numeric value. Compared to other machine learning regression techniques, naive Bayes regression is usually less accurate, but is simple, easy to implement and customize, works on both large and small datasets, is highly interpretable, and doesn't require tuning any hyperparameters.

  • VS Code Copilot Previews New GPT-4o AI Code Completion Model

    The 4o upgrade includes additional training on more than 275,000 high-quality public repositories in over 30 popular programming languages, said Microsoft-owned GitHub, which created the original "AI pair programmer" years ago.

  • Microsoft's Rust Embrace Continues with Azure SDK Beta

    "Rust's strong type system and ownership model help prevent common programming errors such as null pointer dereferencing and buffer overflows, leading to more secure and stable code."

  • Xcode IDE from Microsoft Archrival Apple Gets Copilot AI

    Just after expanding the reach of its Copilot AI coding assistant to the open-source Eclipse IDE, Microsoft showcased how it's going even further, providing details about a preview version for the Xcode IDE from archrival Apple.

Subscribe on YouTube

Upcoming Training Events