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
- WriteableBitmap.cs
- CreateUserErrorEventArgs.cs
- BufferBuilder.cs
- UIElementHelper.cs
- ImportCatalogPart.cs
- WebServiceHandler.cs
- SQLChars.cs
- SqlAliasesReferenced.cs
- TemplateBindingExpression.cs
- HtmlLink.cs
- Array.cs
- RepeatEnumerable.cs
- ImageMapEventArgs.cs
- StringBlob.cs
- EventManager.cs
- XmlSchemaAttribute.cs
- ProxyWebPartManager.cs
- StackBuilderSink.cs
- SessionState.cs
- UIAgentAsyncEndRequest.cs
- GetPageNumberCompletedEventArgs.cs
- XmlSchemaAll.cs
- DataTableMappingCollection.cs
- Debug.cs
- PartialCachingAttribute.cs
- ItemCollectionEditor.cs
- Icon.cs
- XMLDiffLoader.cs
- ManagedIStream.cs
- CompleteWizardStep.cs
- safex509handles.cs
- controlskin.cs
- ContainerUIElement3D.cs
- PartialTrustValidationBehavior.cs
- StringPropertyBuilder.cs
- AspCompat.cs
- XmlnsCompatibleWithAttribute.cs
- ILGenerator.cs
- ConfigurationManagerHelper.cs
- ObjectDisposedException.cs
- WizardStepBase.cs
- ChildTable.cs
- BitmapEditor.cs
- ThaiBuddhistCalendar.cs
- SelectionListComponentEditor.cs
- PropertyInfo.cs
- EventDescriptorCollection.cs
- ToggleButton.cs
- OuterGlowBitmapEffect.cs
- BaseHashHelper.cs
- ProfileService.cs
- TreeNodeBinding.cs
- QueryTreeBuilder.cs
- GroupQuery.cs
- MetabaseServerConfig.cs
- VectorValueSerializer.cs
- CodeDirectionExpression.cs
- SafeBitVector32.cs
- CollectionType.cs
- PeerObject.cs
- BitmapEffectGeneralTransform.cs
- Point4D.cs
- DecimalConstantAttribute.cs
- DivideByZeroException.cs
- BamlMapTable.cs
- WebServiceTypeData.cs
- DrawingAttributesDefaultValueFactory.cs
- ItemChangedEventArgs.cs
- BitmapEffectDrawing.cs
- WindowsToolbarAsMenu.cs
- ZipIOZip64EndOfCentralDirectoryBlock.cs
- ThreadStartException.cs
- EtwProvider.cs
- QueryOptionExpression.cs
- NavigationCommands.cs
- EntityTypeEmitter.cs
- StylusPointPropertyInfo.cs
- GAC.cs
- TextTreeUndoUnit.cs
- validationstate.cs
- ObjectAnimationUsingKeyFrames.cs
- NodeCounter.cs
- BaseCodePageEncoding.cs
- COAUTHIDENTITY.cs
- PropVariant.cs
- ListBoxItemAutomationPeer.cs
- Timer.cs
- WebBrowserNavigatedEventHandler.cs
- XmlDataImplementation.cs
- SafeNativeMethods.cs
- Registry.cs
- SystemIPv4InterfaceProperties.cs
- HtmlElementErrorEventArgs.cs
- DeleteIndexBinder.cs
- DisplayNameAttribute.cs
- BitmapEffectDrawing.cs
- AppSettingsReader.cs
- ListViewGroup.cs
- DependsOnAttribute.cs
- CompoundFileReference.cs