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
- DataTemplate.cs
- LockCookie.cs
- BrowserDefinition.cs
- RijndaelManagedTransform.cs
- CodeSnippetExpression.cs
- AutoGeneratedFieldProperties.cs
- ArrayWithOffset.cs
- ExpressionList.cs
- RuntimeCompatibilityAttribute.cs
- ListParaClient.cs
- NullableConverter.cs
- WindowsGrip.cs
- PersonalizationProvider.cs
- Translator.cs
- ErrorLog.cs
- SqlDataSourceView.cs
- ObjectStorage.cs
- PropertyChangedEventArgs.cs
- EventLogger.cs
- DocumentPage.cs
- OperationPerformanceCounters.cs
- WebBrowserEvent.cs
- BindingRestrictions.cs
- DrawingBrush.cs
- CallbackValidator.cs
- localization.cs
- StyleTypedPropertyAttribute.cs
- StateChangeEvent.cs
- CompositeControl.cs
- ExpressionPrefixAttribute.cs
- IsolatedStorageFileStream.cs
- AdditionalEntityFunctions.cs
- ContractSearchPattern.cs
- KeyMatchBuilder.cs
- HtmlUtf8RawTextWriter.cs
- FlowDocumentFormatter.cs
- baseshape.cs
- BitmapEffectDrawingContextState.cs
- PointValueSerializer.cs
- DelegateArgument.cs
- CodeChecksumPragma.cs
- ObjectDisposedException.cs
- AsnEncodedData.cs
- JoinSymbol.cs
- NavigationService.cs
- ComplexTypeEmitter.cs
- ImageList.cs
- DataError.cs
- SqlIdentifier.cs
- BaseTemplateCodeDomTreeGenerator.cs
- ReachUIElementCollectionSerializerAsync.cs
- DataViewSetting.cs
- TransactedBatchingBehavior.cs
- ReadOnlyCollection.cs
- CatalogPartChrome.cs
- DataContractSet.cs
- SessionPageStateSection.cs
- SqlProfileProvider.cs
- XamlSerializationHelper.cs
- ListViewDeletedEventArgs.cs
- ProxyWebPartConnectionCollection.cs
- DashStyle.cs
- Stackframe.cs
- ObjectItemAttributeAssemblyLoader.cs
- FrameworkElement.cs
- ResXResourceReader.cs
- BooleanFunctions.cs
- ResXDataNode.cs
- DrawingBrush.cs
- CacheMemory.cs
- StyleSelector.cs
- IgnoreSectionHandler.cs
- WorkflowRuntimeServiceElement.cs
- WebPartDescriptionCollection.cs
- BufferModesCollection.cs
- RegexCapture.cs
- ReadOnlyDictionary.cs
- ListItemCollection.cs
- EasingQuaternionKeyFrame.cs
- Encoder.cs
- FullTextBreakpoint.cs
- ApplicationContext.cs
- CodeConstructor.cs
- WindowsFont.cs
- ZipIOModeEnforcingStream.cs
- AtomMaterializer.cs
- PropertyDescriptorCollection.cs
- Parser.cs
- MulticastIPAddressInformationCollection.cs
- Inflater.cs
- StartUpEventArgs.cs
- LinqMaximalSubtreeNominator.cs
- ByteConverter.cs
- WSDualHttpSecurityElement.cs
- OutputCacheSettings.cs
- Context.cs
- UriTemplateTrieLocation.cs
- WindowInteractionStateTracker.cs
- HtmlGenericControl.cs
- UmAlQuraCalendar.cs