<PackageReference Include="AsyncEnumerator" Version="4.0.2" />

Dasync.Collections.AsyncEnumeratorWithState<TItem, TState>

Helps to enumerate items in a collection asynchronously. Provides exactly the same functionality as AsyncEnumerator<T>, but allows to pass a user state object in the enumeration function, what can be used for performance optimization.
namespace Dasync.Collections { public class AsyncEnumeratorWithState<TItem, TState> : CurrentValueContainer<TItem>, IAsyncEnumerator, IDisposable, IAsyncDisposable, IAsyncEnumerator<TItem> { protected TState State { get; } public virtual TItem Current { get; } public bool IsEnumerationComplete { get; } public AsyncEnumeratorWithState(Func<AsyncEnumerator<TItem>.Yield, TState, Task> enumerationFunction, TState state, Action<TState> onDispose = null); public virtual ValueTask<bool> MoveNextAsync(); public void Dispose(); public ValueTask DisposeAsync(); protected virtual void Dispose(bool manualDispose); } }