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
- TypedElement.cs
- FixedPageAutomationPeer.cs
- EventLogPermissionEntryCollection.cs
- LicFileLicenseProvider.cs
- TimeSpanMinutesOrInfiniteConverter.cs
- TypeToTreeConverter.cs
- Dictionary.cs
- LineBreakRecord.cs
- HttpModuleAction.cs
- UIElementParagraph.cs
- SafeLocalMemHandle.cs
- InvokeBinder.cs
- WinEventHandler.cs
- DataColumnCollection.cs
- SchemaImporter.cs
- ReadOnlyDictionary.cs
- WebRequestModuleElementCollection.cs
- OutputCacheSettings.cs
- GcHandle.cs
- DesignerSerializationOptionsAttribute.cs
- ThreadExceptionDialog.cs
- EntityRecordInfo.cs
- DataGridLinkButton.cs
- CellTreeNodeVisitors.cs
- SqlUtil.cs
- ErrorHandler.cs
- ObjectList.cs
- LoginNameDesigner.cs
- DelegateSerializationHolder.cs
- EditingMode.cs
- DiffuseMaterial.cs
- SchemaInfo.cs
- CategoryNameCollection.cs
- XmlEnumAttribute.cs
- TimeoutValidationAttribute.cs
- DragEventArgs.cs
- Int32Converter.cs
- TextServicesLoader.cs
- HandledMouseEvent.cs
- DbSourceParameterCollection.cs
- ScriptControlDescriptor.cs
- XmlExceptionHelper.cs
- BamlWriter.cs
- SoapServerMethod.cs
- TextTreeObjectNode.cs
- ServiceObjectContainer.cs
- AppDomain.cs
- TextEditorTyping.cs
- _SSPIWrapper.cs
- Timer.cs
- JsonFormatWriterGenerator.cs
- XmlSchema.cs
- Wrapper.cs
- SmtpReplyReaderFactory.cs
- PeerTransportSecurityElement.cs
- ToolTip.cs
- DataGridViewBindingCompleteEventArgs.cs
- WebSysDisplayNameAttribute.cs
- DataBoundLiteralControl.cs
- AttachedPropertyBrowsableForChildrenAttribute.cs
- BamlLocalizabilityResolver.cs
- WCFBuildProvider.cs
- XmlSchemaComplexContent.cs
- UserControl.cs
- InfoCardRequestException.cs
- MutableAssemblyCacheEntry.cs
- Trigger.cs
- AddInBase.cs
- TemplateLookupAction.cs
- CommonRemoteMemoryBlock.cs
- ConnectorDragDropGlyph.cs
- EDesignUtil.cs
- DataViewListener.cs
- IpcPort.cs
- RewritingPass.cs
- Int64Storage.cs
- InternalBufferOverflowException.cs
- VirtualPathProvider.cs
- InertiaExpansionBehavior.cs
- Attributes.cs
- IncrementalCompileAnalyzer.cs
- ProvidersHelper.cs
- SubordinateTransaction.cs
- ServerValidateEventArgs.cs
- assemblycache.cs
- StandardTransformFactory.cs
- PresentationTraceSources.cs
- XslAst.cs
- PolygonHotSpot.cs
- HttpConfigurationSystem.cs
- Span.cs
- MachineKeyConverter.cs
- OutOfProcStateClientManager.cs
- TemplateField.cs
- XmlSchemaInfo.cs
- WebPartVerbCollection.cs
- SocketManager.cs
- Exception.cs
- TeredoHelper.cs
- IISMapPath.cs