#if NET20 || NET30 || NET35 || !NET_4_6 using System.Diagnostics.Contracts; namespace System.Threading.Tasks { internal sealed class ContinuationResultTaskFromResultTask : Task, IContinuationTask { private Task _antecedent; public ContinuationResultTaskFromResultTask(Task antecedent, Delegate function, object state, TaskCreationOptions creationOptions, InternalTaskOptions internalOptions) : base(function, state, InternalCurrentIfAttached(creationOptions), default(CancellationToken), creationOptions, internalOptions, TaskScheduler.Default) { Contract.Requires(function is Func, TResult> || function is Func, object, TResult>, "Invalid delegate type in ContinuationResultTaskFromResultTask"); _antecedent = antecedent; CapturedContext = ExecutionContext.Capture(); } Task IContinuationTask.Antecedent { get { return _antecedent; } } /// /// Evaluates the value selector of the Task which is passed in as an object and stores the result. /// internal override void InnerInvoke() { // Get and null out the antecedent. This is crucial to avoid a memory // leak with long chains of continuations. var antecedent = _antecedent; Contract.Assert(antecedent != null, "No antecedent was set for the ContinuationResultTaskFromResultTask."); _antecedent = null; // Invoke the delegate Contract.Assert(Action != null); var func = Action as Func, TResult>; if (func != null) { InternalResult = func(antecedent); return; } var funcWithState = Action as Func, object, TResult>; if (funcWithState != null) { InternalResult = funcWithState(antecedent, State); return; } Contract.Assert(false, "Invalid Action in ContinuationResultTaskFromResultTask"); } } } #endif