In today’s world of distributed applications, many operations are performed asynchronously. A program can begin some operation that takes a relatively long time, such as requesting data from another application, but it doesn’t sit idle, waiting for that operation to complete. Instead, it goes on to do other work and resumes the operation once the data has been received.
Asynchrony certainly is the bread and butter of today’s programmer. I waited until this late in the book to deal with it because it adds a level of complexity that I wanted to postpone in order to make the ideas presented so far more approachable.
Asynchronous operations are represented in C# using Task, and in this chapter, you’ll see that Task<T> is not so different from other containers such as Option<T>, Try<T>, and so on. While Task<T> represents a single value that is delivered asynchronously, IAsyncEnumerable<T> is a recent addition to the language that is used to represent a sequence of values delivered asynchronously. I’ll discuss this in the second part of this chapter.