Streams let you handle data one piece at a time. Async streams do this too, but they work well when data comes slowly or from a remote place.
Stream vs async stream behavior in C Sharp (C#)
Introduction
Syntax
C Sharp (C#)
IEnumerable<T> GetStream() { ... } // for normal stream
IAsyncEnumerable<T> GetAsyncStream() { ... } // for async streamIEnumerable<T> is for synchronous streams.
IAsyncEnumerable<T> is for asynchronous streams and requires await foreach to read.
Examples
C Sharp (C#)
IEnumerable<int> GetNumbers() { yield return 1; yield return 2; yield return 3; }
C Sharp (C#)
async IAsyncEnumerable<int> GetNumbersAsync() { yield return 1; await Task.Delay(1000); yield return 2; await Task.Delay(1000); yield return 3; }
Sample Program
This program shows how to read from a normal stream and an async stream. The async stream waits a bit before giving each number.
C Sharp (C#)
using System; using System.Collections.Generic; using System.Threading.Tasks; class Program { static IEnumerable<int> GetNumbers() { yield return 1; yield return 2; yield return 3; } static async IAsyncEnumerable<int> GetNumbersAsync() { yield return 1; await Task.Delay(500); yield return 2; await Task.Delay(500); yield return 3; } static async Task Main() { Console.WriteLine("Synchronous stream output:"); foreach (var num in GetNumbers()) { Console.WriteLine(num); } Console.WriteLine("\nAsynchronous stream output:"); await foreach (var num in GetNumbersAsync()) { Console.WriteLine(num); } } }
Important Notes
Use foreach for normal streams and await foreach for async streams.
Async streams help keep your app responsive when waiting for data.
Summary
Streams let you process data step-by-step.
Async streams work well when data comes slowly or from outside your program.
Use IEnumerable<T> with foreach and IAsyncEnumerable<T> with await foreach.
Practice
1. What is the main difference between a
Stream and an async stream in C#?easy
Solution
Step 1: Understand Stream behavior
AStreamreads or writes data step-by-step synchronously, blocking the thread until data is processed.Step 2: Understand async stream behavior
Anasync streamusesIAsyncEnumerable<T>andawait foreachto process data asynchronously, allowing other work while waiting for data.Final Answer:
AStreamprocesses data synchronously, while anasync streamprocesses data asynchronously. -> Option AQuick Check:
Sync vs async processing = C [OK]
Hint: Sync streams block; async streams use await foreach [OK]
Common Mistakes:
- Thinking async streams are only for writing data
- Confusing synchronous with asynchronous processing
- Believing streams only handle text or binary exclusively
2. Which of the following is the correct syntax to consume an async stream in C#?
easy
Solution
Step 1: Recall async stream consumption syntax
Async streams requireawait foreachto asynchronously iterate overIAsyncEnumerable<T>.Step 2: Check each option
foreach (var item in asyncStream) { Console.WriteLine(item); } uses regularforeachwhich is invalid for async streams. await foreach (var item in asyncStream) { Console.WriteLine(item); } correctly usesawait foreach. for await (var item in asyncStream) { Console.WriteLine(item); } uses invalid syntaxfor await. async foreach (var item in asyncStream) { Console.WriteLine(item); } uses invalid keyword orderasync foreach.Final Answer:
await foreach (var item in asyncStream) { Console.WriteLine(item); } -> Option BQuick Check:
Async stream needs await foreach = A [OK]
Hint: Use 'await foreach' to read async streams correctly [OK]
Common Mistakes:
- Using regular foreach with async streams
- Swapping 'async' and 'await' keywords incorrectly
- Trying 'for await' which is invalid in C#
3. Consider this code snippet:
async IAsyncEnumerable<int> GetNumbersAsync()
{
for (int i = 1; i <= 3; i++)
{
await Task.Delay(100);
yield return i;
}
}
static async Task Main()
{
await foreach (var num in GetNumbersAsync())
{
Console.Write(num + " ");
}
}
What will be the output when this program runs?medium
Solution
Step 1: Understand async stream generation
The method yields numbers 1 to 3 with a 100ms delay between each, simulating asynchronous data arrival.Step 2: Understand async stream consumption
Theawait foreachprints each number followed by a space as they arrive asynchronously.Final Answer:
1 2 3 -> Option CQuick Check:
Async yield with await foreach prints spaced numbers = A [OK]
Hint: Async yield returns spaced values printed by await foreach [OK]
Common Mistakes:
- Expecting numbers without spaces
- Thinking output is immediate without delay
- Confusing async stream with synchronous enumeration
4. What is wrong with this code snippet?
async IAsyncEnumerable<int> GetDataAsync()
{
for (int i = 0; i < 3; i++)
{
yield return i;
await Task.Delay(100);
}
}medium
Solution
Step 1: Understand async stream yield rules
In async streams,awaitmust appear beforeyield returnbecause the compiler needs to await before producing the next value.Step 2: Analyze the code order
The code yields a value first, then awaits delay, which is invalid and causes a compile error.Final Answer:
Theawaitmust come beforeyield returnin async streams. -> Option AQuick Check:
Await before yield return in async streams = B [OK]
Hint: Await before yield return in async streams to avoid errors [OK]
Common Mistakes:
- Placing yield return before await in async streams
- Confusing return types for async streams
- Assuming no await is needed in async streams
5. You want to process a large file line-by-line without blocking your UI thread. Which approach best fits this scenario in C#?
hard
Solution
Step 1: Identify UI thread blocking issue
Reading large files synchronously blocks the UI thread, causing freezes.Step 2: Choose async streaming approach
UsingIAsyncEnumerable<string>withawait foreachreads lines asynchronously, allowing UI responsiveness.Final Answer:
UseIAsyncEnumerable<string>withawait foreachreading lines asynchronously. -> Option DQuick Check:
Async streams keep UI responsive during file read = D [OK]
Hint: Async streams prevent UI blocking when reading large files [OK]
Common Mistakes:
- Reading files synchronously causing UI freeze
- Loading entire file into memory unnecessarily
- Using blocking Stream methods on UI thread
Recommended
Ready to prove it?
Pass the test and this pattern moves unknown
10 questions ~5 mineasy hard
