public void CompleteExecutionContext(ActivityExecutionContext childContext, bool forcePersist)
        {
            if (this.ownerContext == null)
            {
                throw new ObjectDisposedException("ActivityExecutionContextManager");
            }

            if (childContext == null)
            {
                throw new ArgumentNullException("childContext");
            }

            if (childContext.Activity == null)
            {
                throw new ArgumentException("childContext", SR.GetString(SR.Error_MissingActivityProperty));
            }

            if (childContext.Activity.ContextActivity == null)
            {
                throw new ArgumentException("childContext", SR.GetString(SR.Error_MissingContextActivityProperty));
            }

            if (!this.executionContexts.Contains(childContext))
            {
                throw new ArgumentException();
            }

            if (childContext.Activity.ContextActivity.ExecutionStatus != ActivityExecutionStatus.Closed && childContext.Activity.ContextActivity.ExecutionStatus != ActivityExecutionStatus.Initialized)
            {
                throw new InvalidOperationException(SR.GetString(System.Globalization.CultureInfo.CurrentCulture, SR.Error_CannotCompleteContext));
            }

            // make sure that this is in the active contexts collections
            ActivityExecutionContextInfo childContextInfo = childContext.Activity.ContextActivity.GetValue(Activity.ActivityExecutionContextInfoProperty) as ActivityExecutionContextInfo;
            IList <Activity>             activeContexts   = (IList <Activity>) this.ownerContext.Activity.ContextActivity.GetValue(Activity.ActiveExecutionContextsProperty);

            if (activeContexts == null || !activeContexts.Contains(childContext.Activity.ContextActivity))
            {
                throw new ArgumentException();
            }

            // add it to completed contexts collection
            bool needsCompensation = childContext.Activity.NeedsCompensation;

            if (needsCompensation || forcePersist)
            {
                // add it to completed contexts
                List <ActivityExecutionContextInfo> completedContexts = this.ownerContext.Activity.ContextActivity.GetValue(Activity.CompletedExecutionContextsProperty) as List <ActivityExecutionContextInfo>;
                if (completedContexts == null)
                {
                    completedContexts = new List <ActivityExecutionContextInfo>();
                    this.ownerContext.Activity.ContextActivity.SetValue(Activity.CompletedExecutionContextsProperty, completedContexts);
                }

                if (needsCompensation)
                {
                    childContextInfo.Flags = PersistFlags.NeedsCompensation;
                }
                if (forcePersist)
                {
                    childContextInfo.Flags |= PersistFlags.ForcePersist;
                }

                childContextInfo.SetCompletedOrderId(this.ownerContext.Activity.IncrementCompletedOrderId());
                completedContexts.Add(childContextInfo);

                // ask runtime to save the context activity
                this.ownerContext.Activity.WorkflowCoreRuntime.SaveContextActivity(childContext.Activity);
            }

            // remove it from active contexts
            activeContexts.Remove(childContext.Activity.ContextActivity);
            this.executionContexts.Remove(childContext);

            //Case for those context which has compensatable child context, when those context
            //are completed at the end of Compensation chain we need to uninitialize the context
            //activity associated to them.
            if (childContext.Activity.ContextActivity.CanUninitializeNow && childContext.Activity.ContextActivity.ExecutionResult != ActivityExecutionResult.Uninitialized)
            {
                childContext.Activity.ContextActivity.Uninitialize(this.ownerContext.Activity.RootActivity.WorkflowCoreRuntime);
                childContext.Activity.ContextActivity.SetValue(Activity.ExecutionResultProperty, ActivityExecutionResult.Uninitialized);
            }

            // unregister it from runtime
            this.ownerContext.Activity.WorkflowCoreRuntime.UnregisterContextActivity(childContext.Activity);

            if (!(needsCompensation || forcePersist))
            {
                childContext.Activity.Dispose();
            }
        }
        public void CompleteExecutionContext(ActivityExecutionContext childContext, bool forcePersist)
        {
            if (this.ownerContext == null)
            {
                throw new ObjectDisposedException("ActivityExecutionContextManager");
            }
            if (childContext == null)
            {
                throw new ArgumentNullException("childContext");
            }
            if (childContext.Activity == null)
            {
                throw new ArgumentException("childContext", SR.GetString("Error_MissingActivityProperty"));
            }
            if (childContext.Activity.ContextActivity == null)
            {
                throw new ArgumentException("childContext", SR.GetString("Error_MissingContextActivityProperty"));
            }
            if (!this.executionContexts.Contains(childContext))
            {
                throw new ArgumentException();
            }
            if ((childContext.Activity.ContextActivity.ExecutionStatus != ActivityExecutionStatus.Closed) && (childContext.Activity.ContextActivity.ExecutionStatus != ActivityExecutionStatus.Initialized))
            {
                throw new InvalidOperationException(SR.GetString(CultureInfo.CurrentCulture, "Error_CannotCompleteContext"));
            }
            ActivityExecutionContextInfo item = childContext.Activity.ContextActivity.GetValue(Activity.ActivityExecutionContextInfoProperty) as ActivityExecutionContextInfo;
            IList <Activity>             list = (IList <Activity>) this.ownerContext.Activity.ContextActivity.GetValue(Activity.ActiveExecutionContextsProperty);

            if ((list == null) || !list.Contains(childContext.Activity.ContextActivity))
            {
                throw new ArgumentException();
            }
            bool needsCompensation = childContext.Activity.NeedsCompensation;

            if (needsCompensation || forcePersist)
            {
                List <ActivityExecutionContextInfo> list2 = this.ownerContext.Activity.ContextActivity.GetValue(Activity.CompletedExecutionContextsProperty) as List <ActivityExecutionContextInfo>;
                if (list2 == null)
                {
                    list2 = new List <ActivityExecutionContextInfo>();
                    this.ownerContext.Activity.ContextActivity.SetValue(Activity.CompletedExecutionContextsProperty, list2);
                }
                if (needsCompensation)
                {
                    item.Flags = PersistFlags.NeedsCompensation;
                }
                if (forcePersist)
                {
                    item.Flags = (PersistFlags)((byte)(item.Flags | PersistFlags.ForcePersist));
                }
                item.SetCompletedOrderId(this.ownerContext.Activity.IncrementCompletedOrderId());
                list2.Add(item);
                this.ownerContext.Activity.WorkflowCoreRuntime.SaveContextActivity(childContext.Activity);
            }
            list.Remove(childContext.Activity.ContextActivity);
            this.executionContexts.Remove(childContext);
            if (childContext.Activity.ContextActivity.CanUninitializeNow && (childContext.Activity.ContextActivity.ExecutionResult != ActivityExecutionResult.Uninitialized))
            {
                childContext.Activity.ContextActivity.Uninitialize(this.ownerContext.Activity.RootActivity.WorkflowCoreRuntime);
                childContext.Activity.ContextActivity.SetValue(Activity.ExecutionResultProperty, ActivityExecutionResult.Uninitialized);
            }
            this.ownerContext.Activity.WorkflowCoreRuntime.UnregisterContextActivity(childContext.Activity);
            if (!needsCompensation && !forcePersist)
            {
                childContext.Activity.Dispose();
            }
        }