UtilPack.AsyncEnumeration 1.0.0

Library containing types which support asynchronously fetching next item in a sequence of items.

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

UtilPack.AsyncEnumeration

While async enumerables are still incoming (old link: https://github.com/dotnet/roslyn/issues/261), this project aims to provide API to work with async enumerables.
In the context of this project, async enumerables may be e.g. results of SQL query, or a collection of objects deserialized from e.g. network stream.
The link above seems to discuss also about scenarios like sending query syntax tree of the code enumerating async enumerable to server, which will evaluate it, but this kind of asynchrony is out of the scope of this project.

The best way to start is UtilPack.AsyncEnumeration.AsyncEnumerationFactory class.
As the name suggests, it can be used to create classes implementing various IAsyncEnumerable&lt;T&gt; and IAsyncEnumerator&lt;T&gt; interfaces.
Just like the synchronous System.Collections.Generic.IEnumerator&lt;T&gt; interface, the enumerator starts with being positioned just before first element.

IAsyncEnumerable

This is just like its synchronous counterpart IEnumerable&lt;T&gt; interface, except for asynchronous environment.
One should use EnumerateSequentiallyAsync extension method to enumerate the items of IAsyncEnumerable&lt;T&gt;.

aLINQ

This library also provides a number of methods that correspond to the ones available as LINQ methods to normal IEnumerable&lt;T&gt; interface.
These methods accept both synchronous and asynchronous calllbacks.

IAsyncConcurrentEnumerable

This interface extends IAsyncEnumerable&lt;T&gt; in order to allow concurrent enumeration of its items.
The IAsyncConcurrentEnumerable may still be enumerated sequentially, but it may also be enumerated concurrently by EnumerateConcurrentlyAsync extension method.

Observability

Both IAsyncEnumerable&lt;T&gt; and IAsyncConcurrentEnumerable&lt;T&gt; may also be converted to their observable counterparts using AsObservable extension methods.
The extension methods make sure not to wrap too many items.

The observable events are listed below.

  • The BeforeEnumerationStart event occurs just before starting enumeration in initial WaitForNextAsync call.
  • The AfterEnumerationStart event occurs just after starting enumeration in initial WaitForNextAsync call.
  • The AfterEnumerationItemEncountered event occurs just after next item is successfully fetched by TryGetNext call.
  • The BeforeEnumerationEnd event occurs just before Dispose call.
  • The AfterEnumerationEnd events occurs just after Dispose call.

Distribution

See NuGet package for binary distribution.

UtilPack.AsyncEnumeration

While async enumerables are still incoming (old link: https://github.com/dotnet/roslyn/issues/261), this project aims to provide API to work with async enumerables.
In the context of this project, async enumerables may be e.g. results of SQL query, or a collection of objects deserialized from e.g. network stream.
The link above seems to discuss also about scenarios like sending query syntax tree of the code enumerating async enumerable to server, which will evaluate it, but this kind of asynchrony is out of the scope of this project.

The best way to start is UtilPack.AsyncEnumeration.AsyncEnumerationFactory class.
As the name suggests, it can be used to create classes implementing various IAsyncEnumerable&lt;T&gt; and IAsyncEnumerator&lt;T&gt; interfaces.
Just like the synchronous System.Collections.Generic.IEnumerator&lt;T&gt; interface, the enumerator starts with being positioned just before first element.

IAsyncEnumerable

This is just like its synchronous counterpart IEnumerable&lt;T&gt; interface, except for asynchronous environment.
One should use EnumerateSequentiallyAsync extension method to enumerate the items of IAsyncEnumerable&lt;T&gt;.

aLINQ

This library also provides a number of methods that correspond to the ones available as LINQ methods to normal IEnumerable&lt;T&gt; interface.
These methods accept both synchronous and asynchronous calllbacks.

IAsyncConcurrentEnumerable

This interface extends IAsyncEnumerable&lt;T&gt; in order to allow concurrent enumeration of its items.
The IAsyncConcurrentEnumerable may still be enumerated sequentially, but it may also be enumerated concurrently by EnumerateConcurrentlyAsync extension method.

Observability

Both IAsyncEnumerable&lt;T&gt; and IAsyncConcurrentEnumerable&lt;T&gt; may also be converted to their observable counterparts using AsObservable extension methods.
The extension methods make sure not to wrap too many items.

The observable events are listed below.

  • The BeforeEnumerationStart event occurs just before starting enumeration in initial WaitForNextAsync call.
  • The AfterEnumerationStart event occurs just after starting enumeration in initial WaitForNextAsync call.
  • The AfterEnumerationItemEncountered event occurs just after next item is successfully fetched by TryGetNext call.
  • The BeforeEnumerationEnd event occurs just before Dispose call.
  • The AfterEnumerationEnd events occurs just after Dispose call.

Distribution

See NuGet package for binary distribution.

Release Notes

Added new aLINQ methods: Take, TakeWhile, Skip, SkipWhile, Aggregate, SelectMany. Added also generation classes.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on UtilPack.AsyncEnumeration:

Package Downloads
CBAM.Abstractions
The Connection-Based Asynchronous Messaging (CBAM) Abstractions assembly contains types which are common for any workflow which communicates with e.g. SQL or LDAP processes using some kind of IPC connection.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version History

Version Downloads Last updated
1.0.1 383 6/21/2018
1.0.0 937 5/26/2018
1.0.0-RC6 426 10/29/2017
1.0.0-RC5 288 10/18/2017
1.0.0-RC4 414 9/21/2017
1.0.0-RC2 432 8/17/2017
1.0.0-RC1 382 7/25/2017