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
- WebPartEventArgs.cs
- mansign.cs
- Timer.cs
- RectAnimationUsingKeyFrames.cs
- NumericUpDown.cs
- WindowsUpDown.cs
- Int64Animation.cs
- InstanceDataCollection.cs
- Panel.cs
- MappingSource.cs
- CompiledQueryCacheKey.cs
- EntryPointNotFoundException.cs
- Int64AnimationUsingKeyFrames.cs
- WebPartActionVerb.cs
- RootBuilder.cs
- BCLDebug.cs
- ResourceDescriptionAttribute.cs
- TagMapInfo.cs
- GridItem.cs
- ProcessInputEventArgs.cs
- PackageRelationship.cs
- MsmqBindingFilter.cs
- DeobfuscatingStream.cs
- ObjectDesignerDataSourceView.cs
- mediaclock.cs
- TypeSystem.cs
- WorkflowItemsPresenter.cs
- RecordsAffectedEventArgs.cs
- KeyedHashAlgorithm.cs
- ValidationErrorEventArgs.cs
- GeometryModel3D.cs
- DropShadowEffect.cs
- KeyboardDevice.cs
- XmlSchemaType.cs
- ReachFixedPageSerializer.cs
- ColorMap.cs
- XmlQualifiedNameTest.cs
- EmptyControlCollection.cs
- DataSourceXmlElementAttribute.cs
- XamlTypeMapperSchemaContext.cs
- DoubleLinkList.cs
- Form.cs
- FrugalList.cs
- InputMethod.cs
- RelatedView.cs
- DataGridViewAutoSizeModeEventArgs.cs
- BitmapEffectCollection.cs
- DataFieldEditor.cs
- SimpleMailWebEventProvider.cs
- GPRECTF.cs
- AddIn.cs
- DatagridviewDisplayedBandsData.cs
- oledbmetadatacolumnnames.cs
- TextOutput.cs
- SQLConvert.cs
- ThemeDirectoryCompiler.cs
- ToolStripControlHost.cs
- TreeViewBindingsEditorForm.cs
- XPathParser.cs
- ServiceProviders.cs
- WebPartTransformerCollection.cs
- PrintingPermissionAttribute.cs
- ReflectPropertyDescriptor.cs
- PageThemeCodeDomTreeGenerator.cs
- WebPartConnectionsConnectVerb.cs
- FloaterBaseParagraph.cs
- GenerateTemporaryTargetAssembly.cs
- ProtocolsInstallComponent.cs
- ClientRuntimeConfig.cs
- ServiceBuildProvider.cs
- ImageFormat.cs
- XmlNodeChangedEventArgs.cs
- ControlAdapter.cs
- WebRequestModuleElementCollection.cs
- DocComment.cs
- ExceptionUtility.cs
- Misc.cs
- DefaultAsyncDataDispatcher.cs
- ReferenceConverter.cs
- CryptoConfig.cs
- LocalValueEnumerator.cs
- SelectionRange.cs
- PrintPreviewDialog.cs
- HtmlSelect.cs
- DataGridViewAutoSizeModeEventArgs.cs
- TreeChangeInfo.cs
- CodeLinePragma.cs
- ParameterSubsegment.cs
- AbsoluteQuery.cs
- RuntimeHelpers.cs
- LinkedResource.cs
- TextServicesCompartment.cs
- StructuredTypeEmitter.cs
- EventEntry.cs
- WorkflowItemPresenter.cs
- TextSimpleMarkerProperties.cs
- XmlNamedNodeMap.cs
- SimpleHandlerFactory.cs
- ComboBoxAutomationPeer.cs
- RegexWriter.cs