AsyncEnumerator 1.4.2
See the version list below for details.
dotnet add package AsyncEnumerator --version 1.4.2
NuGet\Install-Package AsyncEnumerator -Version 1.4.2
<PackageReference Include="AsyncEnumerator" Version="1.4.2" />
paket add AsyncEnumerator --version 1.4.2
#r "nuget: AsyncEnumerator, 1.4.2"
// Install AsyncEnumerator as a Cake Addin #addin nuget:?package=AsyncEnumerator&version=1.4.2 // Install AsyncEnumerator as a Cake Tool #tool nuget:?package=AsyncEnumerator&version=1.4.2
Introduces IAsyncEnumerable, IAsyncEnumerator, ForEachAsync(), and ParallelForEachAsync()
GitHub: https://github.com/tyrotoxin/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 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:
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()
{
// 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) {
Console.Out.WriteLine($"{number}");
}
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET Framework | net is compatible. |
This package has no dependencies.
NuGet packages (45)
Showing the top 5 NuGet packages that depend on AsyncEnumerator:
Package | Downloads |
---|---|
NBitcoin.Indexer
Library for querying data indexed by NBitcoin.Indexer on Azure Storage |
|
Elect.Core
.Net Core Utilities methods |
|
Carbon.Kit
Provides interfaces, abstractions and common functions which is the essence of Carbon Kit. |
|
Libplanet.Net
A peer-to-peer networking layer based on Libplanet. |
|
Halforbit.RecordStreams
Package Description |
GitHub repositories (10)
Showing the top 5 popular GitHub repositories that depend on AsyncEnumerator:
Repository | Stars |
---|---|
Flangvik/TeamFiltration
TeamFiltration is a cross-platform framework for enumerating, spraying, exfiltrating, and backdooring O365 AAD accounts
|
|
n00mkrad/text2image-gui
Somewhat modular text2image GUI, initially just for Stable Diffusion
|
|
RevoLand/Steam-Library-Manager
Open source utility to manage Steam, Origin and Uplay libraries in ease of use with multi library support. ||| Steam Games Database: https://stmstat.com
|
|
planetarium/libplanet
Blockchain in C#/.NET for on-chain, decentralized gaming
|
|
Texnomic/SecureDNS
Secure, Modern, Fully-Featured, All-In-One Cross-Architecture & Cross-Platform DNS Server Using .NET 8.0
|
Version | Downloads | Last updated |
---|---|---|
4.0.2 | 16,189,512 | 12/4/2019 |
4.0.1 | 183,696 | 10/22/2019 |
4.0.0 | 47,383 | 10/18/2019 |
3.1.0 | 138,691 | 9/23/2019 |
2.2.2 | 2,225,620 | 1/27/2019 |
2.2.1 | 1,473,610 | 5/29/2018 |
2.2.0 | 47,275 | 5/18/2018 |
2.1.1 | 1,143,978 | 1/20/2018 |
2.1.0 | 332,226 | 5/22/2017 |
2.0.1 | 59,840 | 2/13/2017 |
1.5.0 | 6,469 | 2/12/2017 |
1.4.2 | 4,099 | 2/6/2017 |
1.3.0 | 4,230 | 1/20/2017 |
1.2.3 | 10,605 | 1/6/2017 |
1.2.2 | 4,795 | 12/11/2016 |
1.2.1 | 3,234 | 12/10/2016 |
1.2.0 | 22,375 | 11/29/2016 |
1.1.3 | 3,428 | 11/28/2016 |
1.1.2 | 52,116 | 8/29/2016 |
1.0.3 | 6,619 | 4/28/2016 |
1.4.2: Add finalizer to AsyncEnumerator and call Dispose in ForEachAsync and ParallelForEachAsync extension methods.
1.4.0: Add new generic type AsyncEnumeratorWithState for performance optimization.
Now IAsyncEnumerator<T> is covariant.
Add ForEachAsync, ParallelForeachAsync, and LINQ-style extension methods for IAsyncEnumerator.
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 implementation.
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.