Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Threading / Tasks / TaskResultSetter.cs / 1305376 / TaskResultSetter.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // TaskCompletionSource.cs // //[....] // // TaskCompletionSourceis the producer end of an unbound future. Its // Task member may be distributed as the consumer end of the future. // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System; using System.Security.Permissions; using System.Threading; using System.Diagnostics.Contracts; using System.Collections.Generic; // Disable the "reference to volatile field not treated as volatile" error. #pragma warning disable 0420 namespace System.Threading.Tasks { /// /// Represents the producer side of a ///unbound to a /// delegate, providing access to the consumer side through the property. /// /// ////// It is often the case that a ///is desired to /// represent another asynchronous operation. /// TaskCompletionSource is provided for this purpose. It enables /// the creation of a task that can be handed out to consumers, and those consumers can use the members /// of the task as they would any other. However, unlike most tasks, the state of a task created by a /// TaskCompletionSource is controlled explicitly by the methods on TaskCompletionSource. This enables the /// completion of the external asynchronous operation to be propagated to the underlying Task. The /// separation also ensures that consumers are not able to transition the state without access to the /// corresponding TaskCompletionSource. ////// All members of ///are thread-safe /// and may be used from multiple threads concurrently. /// The type of the result value assocatied with this [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)] public class TaskCompletionSource. { private Task m_task; /// /// Creates a public TaskCompletionSource() : this(null, TaskCreationOptions.None) { } ///. /// /// Creates a ////// with the specified options. /// /// The /// The options to use when creating the underlying ///created /// by this instance and accessible through its property /// will be instantiated using the specified . /// . /// /// The public TaskCompletionSource(TaskCreationOptions creationOptions) : this(null, creationOptions) { } ///represent options invalid for use /// with a . /// /// Creates a /// The state to use as the underlying ////// with the specified state. /// 's AsyncState. public TaskCompletionSource(object state) : this(state, TaskCreationOptions.None) { } /// /// Creates a /// The options to use when creating the underlying ///with /// the specified state and options. /// . /// The state to use as the underlying /// 's AsyncState. /// /// The public TaskCompletionSource(object state, TaskCreationOptions creationOptions) { m_task = new Taskrepresent options invalid for use /// with a . /// (state, CancellationToken.None, creationOptions, InternalTaskOptions.PromiseTask); } /// /// Gets the ///created /// by this . /// /// This property enables a consumer access to the public Taskthat is controlled by this instance. /// The , , /// , and /// methods (and their "Try" variants) on this instance all result in the relevant state /// transitions on this underlying Task. /// Task { get { return m_task; } } /// /// Attempts to transition the underlying /// /// The exception to bind to thisinto the /// Faulted /// state. ///. /// True if the operation was successful; otherwise, false. ///This operation will return false if the /// ///is already in one /// of the three final states: /// RanToCompletion , ///Faulted , or ///Canceled . ///The ///argument is null. The public bool TrySetException(Exception exception) { if (exception == null) throw new ArgumentNullException("exception"); bool rval = m_task.TrySetException(exception); if (!rval && !m_task.IsCompleted) { // The only way that m_task is not completed is if it is in a COMPLETION_RESERVED state. // Just wait a bit until the completion is finalized. SpinWait sw = new SpinWait(); while (!m_task.IsCompleted) sw.SpinOnce(); } return rval; } ///was disposed. /// Attempts to transition the underlying /// /// The collection of exceptions to bind to thisinto the /// Faulted /// state. ///. /// True if the operation was successful; otherwise, false. ///This operation will return false if the /// ///is already in one /// of the three final states: /// RanToCompletion , ///Faulted , or ///Canceled . ///The ///argument is null. There are one or more null elements in ///. The ///collection is empty. The public bool TrySetException(IEnumerablewas disposed. exceptions) { if (exceptions == null) throw new ArgumentNullException("exceptions"); List defensiveCopy = new List (); foreach (Exception e in exceptions) { if (e == null) throw new ArgumentException(Environment.GetResourceString("TaskCompletionSourceT_TrySetException_NullException"), "exceptions"); defensiveCopy.Add(e); } if (defensiveCopy.Count == 0) throw new ArgumentException(Environment.GetResourceString("TaskCompletionSourceT_TrySetException_NoExceptions"), "exceptions"); bool rval = m_task.TrySetException(defensiveCopy); if (!rval && !m_task.IsCompleted) { // The only way that m_task is not completed is if it is in a COMPLETION_RESERVED state. // Just wait a bit until the completion is finalized. SpinWait sw = new SpinWait(); while (!m_task.IsCompleted) sw.SpinOnce(); } return rval; } /// /// Transitions the underlying /// /// The exception to bind to thisinto the /// Faulted /// state. ///. /// The ///argument is null. /// The underlying ///is already in one /// of the three final states: /// RanToCompletion , ///Faulted , or ///Canceled . ///The public void SetException(Exception exception) { if (exception == null) throw new ArgumentNullException("exception"); if (!TrySetException(exception)) { throw new InvalidOperationException(Environment.GetResourceString("TaskT_TransitionToFinal_AlreadyCompleted")); } } ///was disposed. /// Transitions the underlying /// /// The collection of exceptions to bind to thisinto the /// Faulted /// state. ///. /// The ///argument is null. There are one or more null elements in ///. /// The underlying ///is already in one /// of the three final states: /// RanToCompletion , ///Faulted , or ///Canceled . ///The public void SetException(IEnumerablewas disposed. exceptions) { if (!TrySetException(exceptions)) { throw new InvalidOperationException(Environment.GetResourceString("TaskT_TransitionToFinal_AlreadyCompleted")); } } /// /// Attempts to transition the underlying /// /// The result value to bind to thisinto the /// RanToCompletion /// state. ///. /// True if the operation was successful; otherwise, false. ///This operation will return false if the /// ///is already in one /// of the three final states: /// RanToCompletion , ///Faulted , or ///Canceled . ///The public bool TrySetResult(TResult result) { // Attempt to quickly recognize failure. if (m_task.IsCompleted) { return false; } bool rval = m_task.TrySetResult(result); if(!rval && !m_task.IsCompleted) { // The only way that m_task is not completed is if it is in a COMPLETION_RESERVED state. // Just wait a bit until the completion is finalized. SpinWait sw = new SpinWait(); while (!m_task.IsCompleted) sw.SpinOnce(); } return rval; } ///was disposed. /// Transitions the underlying /// /// The result value to bind to thisinto the /// RanToCompletion /// state. ///. /// /// The underlying ///is already in one /// of the three final states: /// RanToCompletion , ///Faulted , or ///Canceled . ///The public void SetResult(TResult result) { m_task.Result = result; } ///was disposed. /// Transitions the underlying /// ///into the /// Canceled /// state. ////// The underlying ///is already in one /// of the three final states: /// RanToCompletion , ///Faulted , or ///Canceled . ///The public void SetCanceled() { if(!TrySetCanceled()) throw new InvalidOperationException(Environment.GetResourceString("TaskT_TransitionToFinal_AlreadyCompleted")); } ///was disposed. /// Attempts to transition the underlying /// ///into the /// Canceled /// state. ///True if the operation was successful; otherwise, false. ///This operation will return false if the /// ///is already in one /// of the three final states: /// RanToCompletion , ///Faulted , or ///Canceled . ///The public bool TrySetCanceled() { bool returnValue = false; // "Reserve" the completion for this task, while making sure that: (1) No prior reservation // has been made, (2) The result has not already been set, (3) An exception has not previously // been recorded, and (4) Cancellation has not been requested. // // If the reservation is successful, then record the cancellation and finish completion processing. // // Note: I had to access static Task variables through Taskwas disposed.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- IQueryable.cs
- codemethodreferenceexpression.cs
- DynamicUpdateCommand.cs
- NameValueSectionHandler.cs
- DbConnectionPool.cs
- InputScope.cs
- LeftCellWrapper.cs
- UserNamePasswordValidator.cs
- VirtualPath.cs
- WindowsProgressbar.cs
- BaseCollection.cs
- DetailsViewRowCollection.cs
- ListControl.cs
- EmptyControlCollection.cs
- VarRemapper.cs
- TextRunProperties.cs
- SimpleType.cs
- ProfileProvider.cs
- VisualStyleRenderer.cs
- Debugger.cs
- PostBackOptions.cs
- Selector.cs
- IgnoreSection.cs
- MemberDomainMap.cs
- InlineCollection.cs
- RichTextBoxAutomationPeer.cs
- Merger.cs
- BufferModesCollection.cs
- Signature.cs
- ScrollPatternIdentifiers.cs
- FieldToken.cs
- StylusSystemGestureEventArgs.cs
- SortQuery.cs
- DoubleAverageAggregationOperator.cs
- SynchronizedCollection.cs
- BitmapEncoder.cs
- ASCIIEncoding.cs
- WorkflowTimerService.cs
- ProcessModelSection.cs
- WebServiceErrorEvent.cs
- OleDbConnectionInternal.cs
- Listbox.cs
- ErrorTolerantObjectWriter.cs
- _NegoState.cs
- SystemIcmpV6Statistics.cs
- entitydatasourceentitysetnameconverter.cs
- AuthenticationException.cs
- DataGridView.cs
- DynamicDocumentPaginator.cs
- FileSystemWatcher.cs
- Range.cs
- basecomparevalidator.cs
- MailMessage.cs
- AppDomainUnloadedException.cs
- ProtocolsConfigurationEntry.cs
- RestHandlerFactory.cs
- StringExpressionSet.cs
- DirectionalLight.cs
- PerformanceCounter.cs
- FixedSOMGroup.cs
- WorkflowEnvironment.cs
- TableLayoutSettingsTypeConverter.cs
- Attachment.cs
- GraphicsPathIterator.cs
- ProfileBuildProvider.cs
- XmlDataImplementation.cs
- XPathAxisIterator.cs
- OleDbTransaction.cs
- DataGridViewDesigner.cs
- ScrollViewer.cs
- FontClient.cs
- SafeRightsManagementSessionHandle.cs
- MergePropertyDescriptor.cs
- CurrentChangingEventArgs.cs
- SingleAnimation.cs
- SqlTypesSchemaImporter.cs
- GridItemCollection.cs
- ContainerCodeDomSerializer.cs
- Root.cs
- EnumerableValidator.cs
- MSG.cs
- CustomCategoryAttribute.cs
- TreeViewImageKeyConverter.cs
- MenuItemStyle.cs
- GeometryDrawing.cs
- ThreadPool.cs
- ErrorStyle.cs
- XmlSchemaElement.cs
- DateTimeOffset.cs
- RepeaterDataBoundAdapter.cs
- ScopeElementCollection.cs
- MsdtcClusterUtils.cs
- ChangeTracker.cs
- RoleServiceManager.cs
- MembershipAdapter.cs
- HttpInputStream.cs
- Operators.cs
- RoleManagerModule.cs
- Hash.cs
- CategoryAttribute.cs