Code:
/ 4.0 / 4.0 / 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
- EmptyEnumerator.cs
- SafeNativeMethods.cs
- SQLMoneyStorage.cs
- DataBindingList.cs
- SingleKeyFrameCollection.cs
- Query.cs
- Visual3DCollection.cs
- Opcode.cs
- ClassicBorderDecorator.cs
- RenderOptions.cs
- MenuBase.cs
- IntellisenseTextBox.designer.cs
- DataReaderContainer.cs
- KeyValuePairs.cs
- BitmapEffectrendercontext.cs
- LabelEditEvent.cs
- UnsafeCollabNativeMethods.cs
- HandlerWithFactory.cs
- PublisherMembershipCondition.cs
- TreeViewBindingsEditor.cs
- SendMessageRecord.cs
- RegisteredScript.cs
- UniqueIdentifierService.cs
- xdrvalidator.cs
- BrowserTree.cs
- MessageUtil.cs
- GuidTagList.cs
- PatternMatcher.cs
- Sql8ExpressionRewriter.cs
- PropertyGrid.cs
- StringFreezingAttribute.cs
- PagePropertiesChangingEventArgs.cs
- UIElement3D.cs
- SQLRoleProvider.cs
- PathSegment.cs
- CompressEmulationStream.cs
- Style.cs
- Base64Encoder.cs
- Span.cs
- Serializer.cs
- ToolStripContainer.cs
- AutoCompleteStringCollection.cs
- VerificationException.cs
- ContravarianceAdapter.cs
- EventKeyword.cs
- HtmlInputImage.cs
- CompositeFontInfo.cs
- DataGridItemCollection.cs
- TrackingProfileDeserializationException.cs
- FloatUtil.cs
- RightNameExpirationInfoPair.cs
- ServiceContractGenerationContext.cs
- BlurEffect.cs
- ThousandthOfEmRealDoubles.cs
- UpdateCompiler.cs
- WorkflowQueueInfo.cs
- HexParser.cs
- WmlLinkAdapter.cs
- DbConnectionPoolGroup.cs
- PersonalizationProviderCollection.cs
- HttpWebResponse.cs
- MembershipPasswordException.cs
- ResourceReferenceExpression.cs
- UnSafeCharBuffer.cs
- QueryGeneratorBase.cs
- ServiceNotStartedException.cs
- Helpers.cs
- StandardToolWindows.cs
- WorkflowApplicationEventArgs.cs
- HttpsTransportBindingElement.cs
- LexicalChunk.cs
- ListViewEditEventArgs.cs
- XmlBufferedByteStreamReader.cs
- PersistenceContextEnlistment.cs
- SizeAnimation.cs
- ApplicationDirectory.cs
- EventProxy.cs
- MissingMemberException.cs
- IndicCharClassifier.cs
- DataKeyCollection.cs
- InlineObject.cs
- Popup.cs
- PermissionListSet.cs
- ForAllOperator.cs
- StylusOverProperty.cs
- TextEditorTyping.cs
- IPEndPoint.cs
- FocusManager.cs
- ProtocolsConfigurationHandler.cs
- DrawToolTipEventArgs.cs
- SigningProgress.cs
- EntityContainerAssociationSet.cs
- PointAnimationUsingKeyFrames.cs
- CodeMethodReturnStatement.cs
- BinaryObjectWriter.cs
- DataServiceKeyAttribute.cs
- SecurityKeyUsage.cs
- OdbcStatementHandle.cs
- FormatSettings.cs
- XmlAnyAttributeAttribute.cs