AsyncEnumerator 1.3.0

Introduces IAsyncEnumerable, IAsyncEnumerator, ForEachAsync(), and ParallelForEachAsync()


Helps to (a) create an element provider, where producing an element can take a lot of time
due to dependency on other asynchronous events (e.g. wait handles, network streams), and
(b) a consumer that processes those element as soon as they are ready without blocking
the thread (the processing is scheduled on a worker thread instead).


using System.Collections.Async;

static IAsyncEnumerable<int> ProduceAsyncNumbers(int start, int end)
 return new AsyncEnumerable<int>(async yield => {

   // Just to show that ReturnAsync can be used multiple times
   await yield.ReturnAsync(start);

   for (int number = start + 1; number <= end; number++)
     await yield.ReturnAsync(number);

   // You can break the enumeration loop with the following call:

   // This won't be executed due to the loop break above
   await yield.ReturnAsync(12345);

// Just to compare with synchronous version of enumerator
static IEnumerable<int> ProduceNumbers(int start, int end)
 yield return start;

 for (int number = start + 1; number <= end; number++)
   yield return number;

 yield break;

 yield return 12345;

static async Task ConsumeNumbersAsync()
 var asyncEnumerableCollection = ProduceAsyncNumbers(start: 1, end: 10);
 await asyncEnumerableCollection.ForEachAsync(async number => {
   await Console.Out.WriteLineAsync($"{number}");

// Just to compare with synchronous version of enumeration
static void ConsumeNumbers()
 // NOTE: IAsyncEnumerable is derived from IEnumerable, so you can use either
 var enumerableCollection = ProduceAsyncNumbers(start: 1, end: 10);
 //var enumerableCollection = ProduceNumbers(start: 1, end: 10);

 foreach (var number in enumerableCollection) {

There is a newer version of this package available.
See the version list below for details.
Install-Package AsyncEnumerator -Version 1.3.0
dotnet add package AsyncEnumerator --version 1.3.0
<PackageReference Include="AsyncEnumerator" Version="1.3.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AsyncEnumerator --version 1.3.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

Release Notes

1.3.0: Significantly improve performance of AsyncEnumerator by reducing thread switching and re-using instances of TaskCompletionSource.
      Add support for a state object that can be passed into AsyncEnumerable and AsyncEnumerator for performance optimization.
      Remove CancellationToken from Select/Take/Skip/Where extension methods - fix improper impelementation.
      Move AsyncEnumerationCanceledException out of the generic AsyncEnumerator type.
      Change default behavior of the ToAsyncEnumerable extension method - now MoveNextAsync will run synchronously by default.
1.2.3: AsyncEnumerationCanceledException is thrown to the async enumeration function when the AsyncEnumerator is disposed before reaching the end of enumeration, what allows to do the clean-up.
      Fixed MoveNextAsync() that threw an exception sometimes only when you passed the end of enumeration.
1.2.2: Fix exception propagation in AsyncEnumerator.
1.2.1: New Linq-style extension methods in System.Collections.Async namespace.
1.2.0: Contract breaking changes in ParallelForEachAsync: introduce ParallelForEachException to unify error outcome of the loop.
1.1.0: Add ParallelForEachAsync extension methods for IEnumerable<T> and IAsyncEnumerable<T> in System.Collections.Async namespace.


This package has no dependencies.

Showing the top 3 GitHub repositories that depend on AsyncEnumerator:

Repository Stars
Open source utility to manage Steam, Origin and Uplay libraries in ease of use with multi library support
Blockchain core in C#/.NET for persistent peer-to-peer online games
Every developer deserves the right of creating microservices without using any framework 🤍

Read more about the GitHub Usage information on our documentation.

Version History

Version Downloads Last updated
4.0.2 39,278 12/4/2019
4.0.1 35,659 10/22/2019
4.0.0 3,776 10/18/2019
3.1.0 20,015 9/23/2019
2.2.2 459,736 1/27/2019
2.2.1 833,399 5/29/2018
2.2.0 17,664 5/18/2018
2.1.1 91,842 1/20/2018
2.1.0 174,611 5/22/2017
2.0.1 44,838 2/13/2017
1.5.0 3,164 2/12/2017
1.4.2 1,069 2/6/2017
1.3.0 1,338 1/20/2017
1.2.3 6,392 1/6/2017
1.2.2 1,419 12/11/2016
1.2.1 417 12/10/2016
1.2.0 16,497 11/29/2016
1.1.3 445 11/28/2016
1.1.2 19,280 8/29/2016
1.0.3 2,146 4/28/2016
Show less