internal override void WrapPartitionedStream <TKey>( PartitionedStream <TSource, TKey> inputStream, IPartitionedStreamRecipient <TSource> recipient, bool preferStriping, QuerySettings settings) { int partitionCount = inputStream.PartitionCount; if (ParallelEnumerable.SinglePartitionMode) { Debug.Assert(partitionCount == 1); } // Generate the shared data. Shared <int> sharedEmptyCount = new Shared <int>(0); CountdownEvent sharedLatch = new CountdownEvent(partitionCount - 1); PartitionedStream <TSource, TKey> outputStream = new PartitionedStream <TSource, TKey>(partitionCount, inputStream.KeyComparer, OrdinalIndexState); for (int i = 0; i < partitionCount; i++) { outputStream[i] = new DefaultIfEmptyQueryOperatorEnumerator <TKey>( inputStream[i], _defaultValue, i, partitionCount, sharedEmptyCount, sharedLatch, settings.CancellationState.MergedCancellationToken); } recipient.Receive(outputStream); }
internal override void WrapPartitionedStream <TKey>(PartitionedStream <TSource, TKey> inputStream, IPartitionedStreamRecipient <TSource> recipient, bool preferStriping, QuerySettings settings) { int partitionCount = inputStream.PartitionCount; Shared <int> sharedEmptyCount = new Shared <int>(0); CountdownEvent sharedLatch = new CountdownEvent(partitionCount - 1); PartitionedStream <TSource, TKey> partitionedStream = new PartitionedStream <TSource, TKey>(partitionCount, inputStream.KeyComparer, this.OrdinalIndexState); for (int i = 0; i < partitionCount; i++) { partitionedStream[i] = new DefaultIfEmptyQueryOperatorEnumerator <TSource, TKey>(inputStream[i], this.m_defaultValue, i, partitionCount, sharedEmptyCount, sharedLatch, settings.CancellationState.MergedCancellationToken); } recipient.Receive <TKey>(partitionedStream); }