<PackageReference Include="Relativity.Server.Transfer.SDK" Version="24000.0.1" />

BlockingCollectionPartitioner<T>

using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading; namespace Relativity.Transfer { internal class BlockingCollectionPartitioner<T> : Partitioner<T> { private readonly BlockingCollection<T> collection; private readonly CancellationToken token; public override bool SupportsDynamicPartitions => true; internal BlockingCollectionPartitioner(BlockingCollection<T> collection, CancellationToken token) { if (collection == null) throw new ArgumentNullException("collection"); this.token = token; this.collection = collection; } public override IList<IEnumerator<T>> GetPartitions(int partitionCount) { if (partitionCount < 1) throw new ArgumentOutOfRangeException("partitionCount"); IEnumerable<T> dynamicPartitioner = GetDynamicPartitions(); return Enumerable.ToArray<IEnumerator<T>>(Enumerable.Select<int, IEnumerator<T>>(Enumerable.Range(0, partitionCount), (Func<int, IEnumerator<T>>)((int _) => dynamicPartitioner.GetEnumerator()))); } public override IEnumerable<T> GetDynamicPartitions() { return collection.GetConsumingEnumerable(token); } } }