Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / Scheduling / SpoolingTaskBase.cs / 1305376 / SpoolingTaskBase.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // SpoolingTaskBase.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Threading; using System.Diagnostics.Contracts; namespace System.Linq.Parallel { ////// A spooling task handles marshaling data from a producer to a consumer. It simply /// takes data from a producer and hands it off to a consumer. This class is the base /// class from which other concrete spooling tasks derive, encapsulating some common /// logic (such as capturing exceptions). /// internal abstract class SpoolingTaskBase : QueryTask { //------------------------------------------------------------------------------------ // Constructs a new spooling task. // // Arguments: // taskIndex - the unique index of this task // protected SpoolingTaskBase(int taskIndex, QueryTaskGroupState groupState) : base(taskIndex, groupState) { } //----------------------------------------------------------------------------------- // The implementation of the Work API just enumerates the producer's data, and // enqueues it into the consumer channel. Well, really, it just defers to extension // points (below) implemented by subclasses to do these things. // protected override void Work() { try { // Defer to the base class for the actual work. SpoolingWork(); } catch (Exception ex) { OperationCanceledException oce = ex as OperationCanceledException; if (oce != null && oce.CancellationToken == m_groupState.CancellationState.MergedCancellationToken && m_groupState.CancellationState.MergedCancellationToken.IsCancellationRequested) { //an expected internal cancellation has occurred. suppress this exception. } else { // TPL will catch and store the exception on the task object. We'll then later // turn around and wait on it, having the effect of propagating it. In the meantime, // we want to cooperative cancel all workers. m_groupState.CancellationState.InternalCancellationTokenSource.Cancel(); // And then repropagate to let TPL catch it. throw; } } finally { SpoolingFinally(); //dispose resources etc. } } //----------------------------------------------------------------------------------- // This method is responsible for enumerating results and enqueueing them to // the output channel(s) as appropriate. Each base class implements its own. // protected abstract void SpoolingWork(); //----------------------------------------------------------------------------------- // If the subclass needs to do something in the finally block of the main work loop, // it should override this and do it. Purely optional. // protected virtual void SpoolingFinally() { // (Intentionally left blank.) } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // SpoolingTaskBase.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Threading; using System.Diagnostics.Contracts; namespace System.Linq.Parallel { ////// A spooling task handles marshaling data from a producer to a consumer. It simply /// takes data from a producer and hands it off to a consumer. This class is the base /// class from which other concrete spooling tasks derive, encapsulating some common /// logic (such as capturing exceptions). /// internal abstract class SpoolingTaskBase : QueryTask { //------------------------------------------------------------------------------------ // Constructs a new spooling task. // // Arguments: // taskIndex - the unique index of this task // protected SpoolingTaskBase(int taskIndex, QueryTaskGroupState groupState) : base(taskIndex, groupState) { } //----------------------------------------------------------------------------------- // The implementation of the Work API just enumerates the producer's data, and // enqueues it into the consumer channel. Well, really, it just defers to extension // points (below) implemented by subclasses to do these things. // protected override void Work() { try { // Defer to the base class for the actual work. SpoolingWork(); } catch (Exception ex) { OperationCanceledException oce = ex as OperationCanceledException; if (oce != null && oce.CancellationToken == m_groupState.CancellationState.MergedCancellationToken && m_groupState.CancellationState.MergedCancellationToken.IsCancellationRequested) { //an expected internal cancellation has occurred. suppress this exception. } else { // TPL will catch and store the exception on the task object. We'll then later // turn around and wait on it, having the effect of propagating it. In the meantime, // we want to cooperative cancel all workers. m_groupState.CancellationState.InternalCancellationTokenSource.Cancel(); // And then repropagate to let TPL catch it. throw; } } finally { SpoolingFinally(); //dispose resources etc. } } //----------------------------------------------------------------------------------- // This method is responsible for enumerating results and enqueueing them to // the output channel(s) as appropriate. Each base class implements its own. // protected abstract void SpoolingWork(); //----------------------------------------------------------------------------------- // If the subclass needs to do something in the finally block of the main work loop, // it should override this and do it. Purely optional. // protected virtual void SpoolingFinally() { // (Intentionally left blank.) } } } // 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
- MultipartContentParser.cs
- NominalTypeEliminator.cs
- DependencyObject.cs
- XamlInt32CollectionSerializer.cs
- ExceptionValidationRule.cs
- TransactedBatchContext.cs
- ListDictionary.cs
- SQLBinary.cs
- IgnoreFileBuildProvider.cs
- PageRanges.cs
- MaskDesignerDialog.cs
- PseudoWebRequest.cs
- BaseCodeDomTreeGenerator.cs
- CustomUserNameSecurityTokenAuthenticator.cs
- AuthenticationModuleElement.cs
- LiteralLink.cs
- Common.cs
- ShellProvider.cs
- TemplateBamlRecordReader.cs
- MetaForeignKeyColumn.cs
- FtpCachePolicyElement.cs
- CodeBinaryOperatorExpression.cs
- GcHandle.cs
- AssertFilter.cs
- documentation.cs
- SmtpMail.cs
- LogArchiveSnapshot.cs
- ChangeConflicts.cs
- ServiceThrottlingElement.cs
- PointConverter.cs
- Rules.cs
- SqlProviderServices.cs
- AddDataControlFieldDialog.cs
- Action.cs
- Peer.cs
- VolatileEnlistmentState.cs
- ChangesetResponse.cs
- Header.cs
- PropertyValidationContext.cs
- XmlSerializationWriter.cs
- HtmlControlPersistable.cs
- sqlnorm.cs
- ListChunk.cs
- DefaultTextStoreTextComposition.cs
- Tablet.cs
- DataPointer.cs
- ToolStripOverflow.cs
- TypeElementCollection.cs
- SystemNetHelpers.cs
- SimpleMailWebEventProvider.cs
- BitmapEffectDrawingContextWalker.cs
- ObjectSecurityT.cs
- ParameterToken.cs
- BindableTemplateBuilder.cs
- IISUnsafeMethods.cs
- Wildcard.cs
- PerformanceCountersElement.cs
- PenContexts.cs
- EpmSyndicationContentDeSerializer.cs
- InkPresenter.cs
- TreeIterators.cs
- MetabaseServerConfig.cs
- ImageFormatConverter.cs
- WebPartsPersonalization.cs
- CornerRadiusConverter.cs
- HtmlEmptyTagControlBuilder.cs
- RegexParser.cs
- WebPartUserCapability.cs
- ClientRuntimeConfig.cs
- SqlNodeTypeOperators.cs
- SqlConnectionStringBuilder.cs
- DbConnectionPoolOptions.cs
- XmlSchemaInclude.cs
- SessionSwitchEventArgs.cs
- ReferencedType.cs
- WebPageTraceListener.cs
- XmlQueryStaticData.cs
- NamespaceDisplay.xaml.cs
- MsdtcWrapper.cs
- XmlSerializationWriter.cs
- PaintValueEventArgs.cs
- HtmlForm.cs
- DoubleLinkList.cs
- DocumentViewer.cs
- SurrogateDataContract.cs
- ListViewSortEventArgs.cs
- CodeGotoStatement.cs
- errorpatternmatcher.cs
- ConfigurationLocationCollection.cs
- OracleBFile.cs
- FtpCachePolicyElement.cs
- XsltInput.cs
- NetworkCredential.cs
- ApplicationFileParser.cs
- EditorPartChrome.cs
- OperationInfo.cs
- MsmqIntegrationElement.cs
- RulePatternOps.cs
- precedingquery.cs
- TransformerTypeCollection.cs