//----------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities.Runtime { using System.Collections.Generic; using System.Runtime.Serialization; using System.Runtime; [DataContract] class ResolveNextArgumentWorkItem : ActivityExecutionWorkItem { int nextArgumentIndex; IDictionary argumentValueOverrides; Location resultLocation; public ResolveNextArgumentWorkItem() { this.IsPooled = true; } [DataMember(EmitDefaultValue = false, Name = "nextArgumentIndex")] internal int SerializedNextArgumentIndex { get { return this.nextArgumentIndex; } set { this.nextArgumentIndex = value; } } [DataMember(EmitDefaultValue = false, Name = "argumentValueOverrides")] internal IDictionary SerializedArgumentValueOverrides { get { return this.argumentValueOverrides; } set { this.argumentValueOverrides = value; } } [DataMember(EmitDefaultValue = false, Name = "resultLocation")] internal Location SerializedResultLocation { get { return this.resultLocation; } set { this.resultLocation = value; } } public override void TraceScheduled() { TraceRuntimeWorkItemScheduled(); } public override void TraceStarting() { TraceRuntimeWorkItemStarting(); } public override void TraceCompleted() { TraceRuntimeWorkItemCompleted(); } public void Initialize(ActivityInstance activityInstance, int nextArgumentIndex, IDictionary argumentValueOverrides, Location resultLocation) { Fx.Assert(nextArgumentIndex > 0, "The nextArgumentIndex must be greater than 0 otherwise we will incorrectly set the sub-state when ResolveArguments completes"); base.Reinitialize(activityInstance); this.nextArgumentIndex = nextArgumentIndex; this.argumentValueOverrides = argumentValueOverrides; this.resultLocation = resultLocation; } // Knowledge at a distance! This method relies on the fact that ResolveArguments will // always schedule a separate work item for expressions that aren't OldFastPath. internal bool CanExecuteUserCode() { Activity activity = this.ActivityInstance.Activity; for (int i = this.nextArgumentIndex; i < activity.RuntimeArguments.Count; i++) { RuntimeArgument argument = activity.RuntimeArguments[i]; if (argument.IsBound && argument.BoundArgument.Expression != null) { return argument.BoundArgument.Expression.UseOldFastPath; } } return false; } protected override void ReleaseToPool(ActivityExecutor executor) { base.ClearForReuse(); this.nextArgumentIndex = 0; this.resultLocation = null; this.argumentValueOverrides = null; executor.ResolveNextArgumentWorkItemPool.Release(this); } public override bool Execute(ActivityExecutor executor, BookmarkManager bookmarkManager) { this.ActivityInstance.ResolveArguments(executor, argumentValueOverrides, resultLocation, nextArgumentIndex); // Return true always to prevent scheduler from yielding silently. return true; } } }