Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / QueryOperators / Inlined / LongCountAggregationOperator.cs / 1305376 / LongCountAggregationOperator.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // CountAggregationOperator.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; namespace System.Linq.Parallel { ////// An inlined count aggregation and its enumerator. /// ///internal sealed class LongCountAggregationOperator : InlinedAggregationOperator { //---------------------------------------------------------------------------------------- // Constructs a new instance of the operator. // internal LongCountAggregationOperator(IEnumerable child) : base(child) { } //--------------------------------------------------------------------------------------- // Executes the entire query tree, and aggregates the intermediate results into the // final result based on the binary operators and final reduction. // // Return Value: // The single result of aggregation. // protected override long InternalAggregate(ref Exception singularExceptionToThrow) { // Because the final reduction is typically much cheaper than the intermediate // reductions over the individual partitions, and because each parallel partition // will do a lot of work to produce a single output element, we prefer to turn off // pipelining, and process the final reductions serially. using (IEnumerator enumerator = GetEnumerator(ParallelMergeOptions.FullyBuffered, true)) { // We just reduce the elements in each output partition. long count = 0; while (enumerator.MoveNext()) { checked { count += enumerator.Current; } } return count; } } //--------------------------------------------------------------------------------------- // Creates an enumerator that is used internally for the final aggregation step. // protected override QueryOperatorEnumerator CreateEnumerator ( int index, int count, QueryOperatorEnumerator source, object sharedData, CancellationToken cancellationToken) { return new LongCountAggregationOperatorEnumerator (source, index, cancellationToken); } //--------------------------------------------------------------------------------------- // This enumerator type encapsulates the intermediary aggregation over the underlying // (possibly partitioned) data source. // private class LongCountAggregationOperatorEnumerator : InlinedAggregationOperatorEnumerator { private readonly QueryOperatorEnumerator m_source; // The source data. //---------------------------------------------------------------------------------------- // Instantiates a new aggregation operator. // internal LongCountAggregationOperatorEnumerator(QueryOperatorEnumerator source, int partitionIndex, CancellationToken cancellationToken) : base(partitionIndex, cancellationToken) { Contract.Assert(source != null); m_source = source; } //--------------------------------------------------------------------------------------- // Counts the elements in the underlying data source, walking the entire thing the first // time MoveNext is called on this object. // protected override bool MoveNextCore(ref long currentElement) { TSource elementUnused = default(TSource); TKey keyUnused = default(TKey); QueryOperatorEnumerator source = m_source; if (source.MoveNext(ref elementUnused, ref keyUnused)) { // We just scroll through the enumerator and keep a running count. long count = 0; int i = 0; do { if ((i++ & CancellationState.POLL_INTERVAL) == 0) CancellationState.ThrowIfCanceled(m_cancellationToken); checked { count++; } } while (source.MoveNext(ref elementUnused, ref keyUnused)); currentElement = count; return true; } return false; } //---------------------------------------------------------------------------------------- // Dispose of resources associated with the underlying enumerator. // protected override void Dispose(bool disposing) { Contract.Assert(m_source != null); m_source.Dispose(); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CatalogZone.cs
- WSSecurityJan2004.cs
- StagingAreaInputItem.cs
- ActivityCompletionCallbackWrapper.cs
- PartialCachingAttribute.cs
- UInt32Storage.cs
- TableLayout.cs
- WebAdminConfigurationHelper.cs
- SmtpMail.cs
- TextReader.cs
- ProtocolsSection.cs
- Rule.cs
- QueryOperator.cs
- DTCTransactionManager.cs
- ModelVisual3D.cs
- FileLoadException.cs
- MetabaseReader.cs
- FileLoadException.cs
- XmlSchemaComplexType.cs
- WebPartUserCapability.cs
- DictionaryTraceRecord.cs
- RestrictedTransactionalPackage.cs
- ToolStripGripRenderEventArgs.cs
- DocumentSchemaValidator.cs
- ConfigurationStrings.cs
- TextParagraph.cs
- Rights.cs
- baseshape.cs
- UrlPropertyAttribute.cs
- SpeakInfo.cs
- AnyReturnReader.cs
- RenderCapability.cs
- SerializationInfoEnumerator.cs
- QueryGenerator.cs
- XhtmlTextWriter.cs
- DescendantBaseQuery.cs
- WrappedIUnknown.cs
- CheckedListBox.cs
- Action.cs
- StylusPlugin.cs
- LowerCaseStringConverter.cs
- UTF7Encoding.cs
- ZoneButton.cs
- SoapException.cs
- Point4D.cs
- ReplyChannelBinder.cs
- FramingChannels.cs
- StatusBar.cs
- DefaultDiscoveryService.cs
- InfoCardRequestException.cs
- Style.cs
- Model3D.cs
- View.cs
- AlphaSortedEnumConverter.cs
- BulletedList.cs
- D3DImage.cs
- KeyGesture.cs
- AlternateView.cs
- XmlDeclaration.cs
- TextWriterTraceListener.cs
- Tool.cs
- CodeCatchClause.cs
- HtmlInputFile.cs
- EventWaitHandle.cs
- DriveInfo.cs
- ConfigXmlText.cs
- InputLanguageProfileNotifySink.cs
- SoapHeader.cs
- EntityDesignerBuildProvider.cs
- ServiceProviders.cs
- ManipulationLogic.cs
- UpdateCommand.cs
- ValueUtilsSmi.cs
- DrawingImage.cs
- TextTrailingWordEllipsis.cs
- ItemType.cs
- TrackingMemoryStream.cs
- OutputCacheSettingsSection.cs
- SmiGettersStream.cs
- sqlpipe.cs
- SizeAnimationClockResource.cs
- AsymmetricSignatureFormatter.cs
- SafeFindHandle.cs
- IdentitySection.cs
- KoreanLunisolarCalendar.cs
- FastEncoderWindow.cs
- SubqueryRules.cs
- TrailingSpaceComparer.cs
- RecognitionEventArgs.cs
- CalculatedColumn.cs
- CreateDataSourceDialog.cs
- MenuItemBindingCollection.cs
- LiteralControl.cs
- PermissionSetTriple.cs
- SoapTypeAttribute.cs
- HttpInputStream.cs
- DateTimeStorage.cs
- MimeObjectFactory.cs
- Point3DCollectionValueSerializer.cs
- OracleDataReader.cs