AsyncEnumerator (nuget): Introduces IAsyncEnumerable, IAsyncEnumerator, ForEachAsync(), and ParallelForEachAsync() GitHub: https://github.com/Dasync/AsyncEnumerable  PROBLEM SPACE  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).   EXAMPLE  using Dasync.Collections;  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:     yield.Break();      // 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() {   var enumerableCollection = ProduceNumbers(start: 1, end: 10);   foreach (var number in enumerableCollection) {     Console.Out.WriteLine($"{number}");   } }
Keywords: IAsyncEnumerable|IAsyncEnumerator|ForEachAsync|ParallelForEachAsync|async|await|foreach|parallel|async-streams|linq|charp|.net|asyncenumerator|csharp|enumerable|enumerator