C# 8 adds support for asynchronuous iterator blocks, so you can await things and return an IAsyncEnumarator
instead of an IEnumerable
:
public async IAsyncEnumerable<int> EnumerateAsync() {
for (int i = 0; i < 10; i++) {
yield return i;
await Task.Delay(1000);
}
}
With a non-blocking consuming code that looks like this:
await foreach (var item in EnumerateAsync()) {
Console.WriteLine(item);
}
This will result in my code running for about 10 seconds. However, sometimes I want to break out of the await foreach
before all elements are consumed. With an break
however, we would need to wait until the current awaited Task.Delay
has finished. How can we break immediately out of that loop without waiting for any dangling async tasks?