예제 #1
0
        protected override void OnActivityChangeRemove(ActivityExecutionContext executionContext, Activity removedActivity)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }
            if (removedActivity == null)
            {
                throw new ArgumentNullException("removedActivity");
            }

            EventDrivenActivity eda = removedActivity as EventDrivenActivity;

            // find out the status of the scope
            EventHandlersActivity activity = (EventHandlersActivity)executionContext.Activity as EventHandlersActivity;

            if (activity.ExecutionStatus == ActivityExecutionStatus.Executing && activity.ActivityState != null && !activity.IsScopeCompleted)
            {
                for (int i = 0; i < activity.ActivityState.Count; ++i)
                {
                    EventHandlerEventActivitySubscriber eventSubscriber = activity.ActivityState[i];
                    if (eventSubscriber.eventDrivenActivity.QualifiedName.Equals(removedActivity.QualifiedName))
                    {
                        eda.EventActivity.Unsubscribe(executionContext, eventSubscriber);
                        activity.ActivityState.RemoveAt(i);
                        return;
                    }
                }
            }
        }
예제 #2
0
        protected override void OnActivityChangeRemove(ActivityExecutionContext executionContext, Activity removedActivity)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }
            if (removedActivity == null)
            {
                throw new ArgumentNullException("removedActivity");
            }
            EventDrivenActivity   activity  = removedActivity as EventDrivenActivity;
            EventHandlersActivity activity2 = (EventHandlersActivity)executionContext.Activity;

            if (((activity2.ExecutionStatus == ActivityExecutionStatus.Executing) && (activity2.ActivityState != null)) && !activity2.IsScopeCompleted)
            {
                for (int i = 0; i < activity2.ActivityState.Count; i++)
                {
                    EventHandlerEventActivitySubscriber parentEventHandler = activity2.ActivityState[i];
                    if (parentEventHandler.eventDrivenActivity.QualifiedName.Equals(removedActivity.QualifiedName))
                    {
                        activity.EventActivity.Unsubscribe(executionContext, parentEventHandler);
                        activity2.ActivityState.RemoveAt(i);
                        return;
                    }
                }
            }
        }
예제 #3
0
        protected override ActivityExecutionStatus Cancel(ActivityExecutionContext executionContext)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }

            if (this.ActivityState == null)
            {
                return(ActivityExecutionStatus.Closed);
            }

            bool scopeCompleted = this.IsScopeCompleted;
            bool canCloseNow    = true;

            for (int i = 0; i < this.EnabledActivities.Count; ++i)
            {
                EventDrivenActivity childActivity = this.EnabledActivities[i] as EventDrivenActivity;
                EventHandlerEventActivitySubscriber eventActivitySubscriber = this.ActivityState[i] as EventHandlerEventActivitySubscriber;

                eventActivitySubscriber.PendingExecutionCount = 0;

                ActivityExecutionContextManager contextManager = executionContext.ExecutionContextManager;
                ActivityExecutionContext        childContext   = contextManager.GetExecutionContext(childActivity);

                if (childContext != null)
                {
                    switch (childContext.Activity.ExecutionStatus)
                    {
                    case ActivityExecutionStatus.Canceling:
                    case ActivityExecutionStatus.Faulting:
                        canCloseNow = false;
                        break;

                    case ActivityExecutionStatus.Executing:
                        childContext.CancelActivity(childContext.Activity);
                        canCloseNow = false;
                        break;
                    }
                }

                if (!scopeCompleted) //UnSubscribe from event.
                {
                    childActivity.EventActivity.Unsubscribe(executionContext, eventActivitySubscriber);
                }
            }

            if (canCloseNow)
            {
                this.ActivityState = null;
                return(ActivityExecutionStatus.Closed);
            }
            else
            {
                return(this.ExecutionStatus);
            }
        }
예제 #4
0
        private void OnUnsubscribeAndClose(object sender, EventArgs args)
        {
            if (sender == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }

            ActivityExecutionContext context = (ActivityExecutionContext)sender;

            if (context == null)
            {
                throw new ArgumentException("sender");
            }

            EventHandlersActivity handlers = context.Activity as EventHandlersActivity;

            if (context.Activity.ExecutionStatus != ActivityExecutionStatus.Executing)
            {
                return;
            }

            Debug.Assert(!handlers.IsScopeCompleted, "Only notified of scope body completion once");
            handlers.IsScopeCompleted = true;

            ActivityExecutionContextManager contextManager = context.ExecutionContextManager;
            bool readyToClose = true;

            for (int i = 0; i < handlers.EnabledActivities.Count; ++i)
            {
                EventDrivenActivity evtDriven = handlers.EnabledActivities[i] as EventDrivenActivity;
                EventHandlerEventActivitySubscriber eventSubscriber = handlers.ActivityState[i];
                evtDriven.EventActivity.Unsubscribe(context, eventSubscriber);

                if (contextManager.GetExecutionContext(evtDriven) != null || handlers.ActivityState[i].PendingExecutionCount != 0)
                {
                    readyToClose = false;
                }
            }

            if (readyToClose)
            {
                handlers.ActivityState = null;
                context.CloseActivity();
            }
        }
예제 #5
0
        protected override void OnActivityChangeAdd(ActivityExecutionContext executionContext, Activity addedActivity)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }
            if (addedActivity == null)
            {
                throw new ArgumentNullException("addedActivity");
            }
            EventDrivenActivity   eventDriven = addedActivity as EventDrivenActivity;
            EventHandlersActivity activity    = (EventHandlersActivity)executionContext.Activity;
            EventHandlerEventActivitySubscriber parentEventHandler = new EventHandlerEventActivitySubscriber(eventDriven);

            if (((activity.ExecutionStatus == ActivityExecutionStatus.Executing) && (activity.ActivityState != null)) && !activity.IsScopeCompleted)
            {
                eventDriven.EventActivity.Subscribe(executionContext, parentEventHandler);
                activity.ActivityState.Insert(activity.EnabledActivities.IndexOf(addedActivity), parentEventHandler);
            }
        }
예제 #6
0
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            if (executionContext == null)
            {
                throw new ArgumentNullException("executionContext");
            }

            List <EventHandlerEventActivitySubscriber> eventActivitySubscribers = new List <EventHandlerEventActivitySubscriber>();

            this.ActivityState = eventActivitySubscribers;

            for (int i = 0; i < this.EnabledActivities.Count; ++i)
            {
                EventDrivenActivity childActivity = this.EnabledActivities[i] as EventDrivenActivity;
                EventHandlerEventActivitySubscriber eventDrivenSubscriber = new EventHandlerEventActivitySubscriber(childActivity);
                eventActivitySubscribers.Add(eventDrivenSubscriber);
                childActivity.EventActivity.Subscribe(executionContext, eventDrivenSubscriber);
            }
            return(ActivityExecutionStatus.Executing);
        }
예제 #7
0
        void IActivityEventListener <ActivityExecutionStatusChangedEventArgs> .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
        {
            if (sender == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (e == null)
            {
                throw new ArgumentNullException("e");
            }

            ActivityExecutionContext context = sender as ActivityExecutionContext;

            if (context == null)
            {
                throw new ArgumentException(SR.Error_SenderMustBeActivityExecutionContext, "sender");
            }

            EventDrivenActivity   eda           = e.Activity as EventDrivenActivity;
            EventHandlersActivity eventHandlers = context.Activity as EventHandlersActivity;

            e.Activity.UnregisterForStatusChange(Activity.ClosedEvent, this);

            ActivityExecutionContextManager contextManager = context.ExecutionContextManager;

            contextManager.CompleteExecutionContext(contextManager.GetExecutionContext(eda));

            switch (eventHandlers.ExecutionStatus)
            {
            case ActivityExecutionStatus.Executing:
                for (int i = 0; i < eventHandlers.EnabledActivities.Count; ++i)
                {
                    if (eventHandlers.EnabledActivities[i].QualifiedName.Equals(eda.QualifiedName))
                    {
                        EventHandlerEventActivitySubscriber eventActivitySubscriber = eventHandlers.ActivityState[i];

                        if (eventActivitySubscriber.PendingExecutionCount > 0)
                        {
                            eventActivitySubscriber.PendingExecutionCount--;
                            eventActivitySubscriber.IsBlocked = false;

                            ActivityExecutionContext childContext = contextManager.CreateExecutionContext(eventHandlers.EnabledActivities[i]);
                            childContext.Activity.RegisterForStatusChange(Activity.ClosedEvent, this);
                            childContext.ExecuteActivity(childContext.Activity);
                        }
                        else
                        {
                            eventActivitySubscriber.IsBlocked = true;
                            if (eventHandlers.IsScopeCompleted && AllHandlersAreQuiet(eventHandlers, context))
                            {
                                context.CloseActivity();
                            }
                        }
                        break;
                    }
                }
                break;

            case ActivityExecutionStatus.Canceling:
            case ActivityExecutionStatus.Faulting:
                if (AllHandlersAreQuiet(eventHandlers, context))
                {
                    context.CloseActivity();
                }
                break;
            }
        }