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(); } }