interleavedforeach.cs

来自「WF本质论一书的源码,要书籍的朋友同我联系.」· CS 代码 · 共 76 行

CS
76
字号
using System;
using System.Collections;
using System.Workflow.ComponentModel;

namespace EssentialWF.Activities {
    public class InterleavedForEach : CompositeActivity {
        int totalCount = 0;
        int closedCount = 0;
        public static readonly DependencyProperty IterationVariableProperty =DependencyProperty.RegisterAttached("IterationVariable",typeof(object),typeof(InterleavedForEach));

        public static object GetIterationVariable(DependencyObject dependencyObject) {
          return dependencyObject.GetValue(IterationVariableProperty);
        }

        public static void SetIterationVariable(DependencyObject dependencyObject,object value) {
          dependencyObject.SetValue(IterationVariableProperty, value);
        }

        public static readonly DependencyProperty CollectionProperty = DependencyProperty.Register("Collection",typeof(IEnumerable),typeof(InterleavedForEach));
            
        public IEnumerable Collection {
          get { return (IEnumerable) GetValue(CollectionProperty); }
          set { SetValue(CollectionProperty, value); }
        }

        protected override ActivityExecutionStatus Execute(ActivityExecutionContext context) {
            if (Collection == null)
              return ActivityExecutionStatus.Closed;

            Activity template = this.EnabledActivities[0];
            ActivityExecutionContextManager manager = 
                    context.ExecutionContextManager;

            foreach (object item in Collection) {
              totalCount++;
              ActivityExecutionContext newContext =
                 manager.CreateExecutionContext(template);
              Activity newActivity = newContext.Activity;

              InterleavedForEach.SetIterationVariable(newActivity, item);

              newActivity.Closed += this.ContinueAt;
              newContext.ExecuteActivity(newActivity);
            }

            if (totalCount == 0)
                return ActivityExecutionStatus.Closed;

            return ActivityExecutionStatus.Executing;
        }

        void ContinueAt(object sender, ActivityExecutionStatusChangedEventArgs e) {
            e.Activity.Closed -= this.ContinueAt;

            ActivityExecutionContext context = sender as ActivityExecutionContext;
            ActivityExecutionContextManager manager = context.ExecutionContextManager;

            ActivityExecutionContext innerContext = manager.GetExecutionContext(e.Activity);
            manager.CompleteExecutionContext(innerContext);

            if (totalCount == ++closedCount)
                context.CloseActivity();
        }
    
        public Activity[] ActiveIterations {
          get {
              if (this.EnabledActivities.Count > 0) {
                  Activity template = EnabledActivities[0];
                  return GetDynamicActivities(template);
              }
              return null;
          }
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?