Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / Scheduling / CancellationState.cs / 1305376 / CancellationState.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // CancellationState.cs // //[....] // // A bag of cancellation-related items that are passed around as a group. // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System; using System.Collections.Generic; using System.Threading; namespace System.Linq.Parallel { internal class CancellationState { // a cancellation signal that can be set internally to prompt early query termination. internal CancellationTokenSource InternalCancellationTokenSource; // the external cancellationToken that the user sets to ask for the query to terminate early. // this has to be tracked explicitly so that an OCE(externalToken) can be thrown as the query // execution unravels. internal CancellationToken ExternalCancellationToken; // A combined token Source for internal/external cancellation, defining the total cancellation state. internal CancellationTokenSource MergedCancellationTokenSource; // A combined token for internal/external cancellation, defining the total cancellation state. internal CancellationToken MergedCancellationToken { get { if( MergedCancellationTokenSource != null) return MergedCancellationTokenSource.Token; else return new CancellationToken(false); } } // A shared boolean flag to track whether a query-opening-enumerator dispose has occured. internal SharedTopLevelDisposedFlag; internal CancellationState(CancellationToken externalCancellationToken) { ExternalCancellationToken = externalCancellationToken; TopLevelDisposedFlag = new Shared (false); //it would always be initialised to false, so no harm doing it here and avoid #if around constructors. } /// /// Poll frequency (number of loops per cancellation check) for situations where per-1-loop testing is too high an overhead. /// internal const int POLL_INTERVAL = 63; //must be of the form (2^n)-1. // The two main situations requiring POLL_INTERVAL are: // 1. inner loops of sorting/merging operations // 2. tight loops that perform very little work per MoveNext call. // Testing has shown both situations have similar requirements and can share the same constant for polling interval. // // Because the poll checks are per-N loops, if there are delays in user code, they may affect cancellation timeliness. // Guidance is that all user-delegates should perform cancellation checks at least every 1ms. // // Inner loop code should poll once per n loop, typically via: // if ((i++ & CancellationState.POLL_INTERVAL) == 0) // CancellationState.ThrowIfCanceled(m_cancellationToken); // (Note, this only behaves as expected if FREQ is of the form (2^n)-1 ////// Throws an OCE if the merged token has been canceled. /// /// A token to check for cancelation. internal static void ThrowIfCanceled(CancellationToken token) { if (token.IsCancellationRequested) throw new OperationCanceledException(token); } // Test if external cancellation was requested and occured, and if so throw a standardize OCE with standardized message internal static void ThrowWithStandardMessageIfCanceled(CancellationToken externalCancellationToken) { if (externalCancellationToken.IsCancellationRequested) { string oceMessage = SR.GetString(SR.PLINQ_ExternalCancellationRequested); throw new OperationCanceledException(oceMessage, externalCancellationToken); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // CancellationState.cs // //[....] // // A bag of cancellation-related items that are passed around as a group. // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System; using System.Collections.Generic; using System.Threading; namespace System.Linq.Parallel { internal class CancellationState { // a cancellation signal that can be set internally to prompt early query termination. internal CancellationTokenSource InternalCancellationTokenSource; // the external cancellationToken that the user sets to ask for the query to terminate early. // this has to be tracked explicitly so that an OCE(externalToken) can be thrown as the query // execution unravels. internal CancellationToken ExternalCancellationToken; // A combined token Source for internal/external cancellation, defining the total cancellation state. internal CancellationTokenSource MergedCancellationTokenSource; // A combined token for internal/external cancellation, defining the total cancellation state. internal CancellationToken MergedCancellationToken { get { if( MergedCancellationTokenSource != null) return MergedCancellationTokenSource.Token; else return new CancellationToken(false); } } // A shared boolean flag to track whether a query-opening-enumerator dispose has occured. internal SharedTopLevelDisposedFlag; internal CancellationState(CancellationToken externalCancellationToken) { ExternalCancellationToken = externalCancellationToken; TopLevelDisposedFlag = new Shared (false); //it would always be initialised to false, so no harm doing it here and avoid #if around constructors. } /// /// Poll frequency (number of loops per cancellation check) for situations where per-1-loop testing is too high an overhead. /// internal const int POLL_INTERVAL = 63; //must be of the form (2^n)-1. // The two main situations requiring POLL_INTERVAL are: // 1. inner loops of sorting/merging operations // 2. tight loops that perform very little work per MoveNext call. // Testing has shown both situations have similar requirements and can share the same constant for polling interval. // // Because the poll checks are per-N loops, if there are delays in user code, they may affect cancellation timeliness. // Guidance is that all user-delegates should perform cancellation checks at least every 1ms. // // Inner loop code should poll once per n loop, typically via: // if ((i++ & CancellationState.POLL_INTERVAL) == 0) // CancellationState.ThrowIfCanceled(m_cancellationToken); // (Note, this only behaves as expected if FREQ is of the form (2^n)-1 ////// Throws an OCE if the merged token has been canceled. /// /// A token to check for cancelation. internal static void ThrowIfCanceled(CancellationToken token) { if (token.IsCancellationRequested) throw new OperationCanceledException(token); } // Test if external cancellation was requested and occured, and if so throw a standardize OCE with standardized message internal static void ThrowWithStandardMessageIfCanceled(CancellationToken externalCancellationToken) { if (externalCancellationToken.IsCancellationRequested) { string oceMessage = SR.GetString(SR.PLINQ_ExternalCancellationRequested); throw new OperationCanceledException(oceMessage, externalCancellationToken); } } } } // 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
- InkPresenterAutomationPeer.cs
- SchemaImporterExtensionsSection.cs
- ServiceHostingEnvironment.cs
- MessageBox.cs
- DnsPermission.cs
- TimeZone.cs
- ColorIndependentAnimationStorage.cs
- TreeWalkHelper.cs
- EventLogPermission.cs
- MemberAssignmentAnalysis.cs
- TeredoHelper.cs
- BamlCollectionHolder.cs
- PointAnimationBase.cs
- ManualWorkflowSchedulerService.cs
- AlternationConverter.cs
- XmlEventCache.cs
- HttpRawResponse.cs
- SqlFlattener.cs
- FontUnit.cs
- CodeTypeDelegate.cs
- Gdiplus.cs
- AsymmetricSignatureFormatter.cs
- TextTrailingCharacterEllipsis.cs
- NameValueConfigurationCollection.cs
- SplitterPanel.cs
- UIElementAutomationPeer.cs
- ThemeConfigurationDialog.cs
- OdbcCommand.cs
- RequestTimeoutManager.cs
- ListViewItem.cs
- CodeObjectCreateExpression.cs
- QilDataSource.cs
- DependencyPropertyConverter.cs
- LogAppendAsyncResult.cs
- HttpContext.cs
- SettingsPropertyValue.cs
- formatter.cs
- EventMappingSettings.cs
- HMACSHA512.cs
- SchemaMapping.cs
- DefaultAuthorizationContext.cs
- ContactManager.cs
- CalendarTable.cs
- NetTcpSection.cs
- PkcsUtils.cs
- ProxyElement.cs
- ResourcesGenerator.cs
- RemotingConfiguration.cs
- LinkConverter.cs
- GridSplitter.cs
- ChangeBlockUndoRecord.cs
- NameHandler.cs
- BooleanToVisibilityConverter.cs
- XamlPoint3DCollectionSerializer.cs
- TemplateInstanceAttribute.cs
- ContentControl.cs
- XpsSerializationException.cs
- PropertyExpression.cs
- WebPartEventArgs.cs
- TrayIconDesigner.cs
- PersonalizationStateQuery.cs
- StateMachine.cs
- ComponentEditorPage.cs
- ClientScriptItemCollection.cs
- CorrelationScope.cs
- DebugView.cs
- SecUtil.cs
- PreviewKeyDownEventArgs.cs
- Int64KeyFrameCollection.cs
- WpfWebRequestHelper.cs
- Method.cs
- SingleSelectRootGridEntry.cs
- IDataContractSurrogate.cs
- WindowsToolbar.cs
- PrivateFontCollection.cs
- ObjectStateEntry.cs
- RelationshipFixer.cs
- StrokeCollection2.cs
- ContractCodeDomInfo.cs
- Scene3D.cs
- CqlLexer.cs
- WindowsFormsHelpers.cs
- FilteredReadOnlyMetadataCollection.cs
- EntryPointNotFoundException.cs
- DataGridViewRowHeightInfoNeededEventArgs.cs
- StylesEditorDialog.cs
- DSASignatureFormatter.cs
- AspCompat.cs
- TextLineBreak.cs
- CreateUserWizardAutoFormat.cs
- SafeArchiveContext.cs
- SafeEventLogReadHandle.cs
- SqlCacheDependencyDatabaseCollection.cs
- TaskFormBase.cs
- XmlAttribute.cs
- SafeHandles.cs
- ItemsControl.cs
- PasswordDeriveBytes.cs
- DataGridViewRowHeightInfoNeededEventArgs.cs
- ListenerChannelContext.cs