private static async Task RunConsumerAsync(IAsyncBatchCollection <int> queue, IntHolder itemsTakeHolder, int itemsAddedTotal, CancellationTokenSource cancelSource)
        {
            try
            {
                CancellationToken cancelToken = cancelSource.Token;

                while (true)
                {
                    IReadOnlyList <int> items = await queue.TakeAsync(cancelToken).ConfigureAwait(false);

                    int itemsTakenLocal = Interlocked.Add(ref itemsTakeHolder.Value, items.Count);

                    if (itemsTakenLocal >= itemsAddedTotal)
                    {
                        cancelSource.Cancel();
                    }
                }
            }
            catch (OperationCanceledException)
            {
            }
        }
Ejemplo n.º 2
0
 public ValueTask <IReadOnlyList <T> > TakeAsync(CancellationToken cancellationToken) => _innerCollection.TakeAsync(cancellationToken);
 public static ValueTask <IReadOnlyList <T> > TakeAsync <T>(this IAsyncBatchCollection <T> collection) => collection.TakeAsync(CancellationToken.None);