In this article, learn how to efficiently process data in a non-blocking way using the pipeline pattern. Compose and test pipelines using .NETs channels, and see how to cancel and handle errors. Implement a program that counts lines of code by recursively enumerating workspace files, filtering by source code extensions, and counting the lines. Each stage runs concurrently and shares no state, communicating via channels. Channels serve as a transport mechanism between stages, passing results from input to output channels. The pipeline starts with a generator method, which initiates jobs by passing it to the stages.