⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interleavedforeach.cs

📁 WF本质论一书的源码,要书籍的朋友同我联系.
💻 CS
字号:
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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -