通过AEC解读WF的核心原理(五)实现一个从下向上执行的顺序容器
说明
本例实现了一个从下向上倒着执行的顺序容器,本例并无什么具体的应用场景,只是一个控制子Activity执行的演示,
本例演示了如何按一定规则执行子Activity,并在子Activity执行完成后关闭子Activity,在全部业务完成后关闭自已
例子下载:https://files.cnblogs.com/wxwinter/aec5.rar
例子
自定义Activity
public class Activity1: SequenceActivity { int index; protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { index = this.EnabledActivities.Count - 1; var v = this.EnabledActivities[index]; v.Closed +=v_Closed; executionContext.ExecuteActivity(v); return ActivityExecutionStatus.Executing; }
void v_Closed(object sender, ActivityExecutionStatusChangedEventArgs e) { ActivityExecutionContext executionContext = sender as ActivityExecutionContext;
e.Activity.Closed -= v_Closed; index = index - 1; if (index < 0) { executionContext.CloseActivity(); } else { var v = this.EnabledActivities[index]; v.Closed +=v_Closed; executionContext.ExecuteActivity(v); }
} } |
测试用工作流
public class Workflow1: SequentialWorkflowActivity { private CodeActivity codeActivity4; private CodeActivity codeActivity3; private CodeActivity codeActivity2; private CodeActivity codeActivity1; private Activity1 activity11;
public Workflow1() { InitializeComponent(); } [System.Diagnostics.DebuggerNonUserCode] private void InitializeComponent() { this.CanModifyActivities = true; this.codeActivity4 = new System.Workflow.Activities.CodeActivity(); this.codeActivity3 = new System.Workflow.Activities.CodeActivity(); this.codeActivity2 = new System.Workflow.Activities.CodeActivity(); this.codeActivity1 = new System.Workflow.Activities.CodeActivity(); this.activity11 = new wxwinterAecTest.Activity1(); // // codeActivity4 // this.codeActivity4.Name = "codeActivity4"; this.codeActivity4.ExecuteCode += new System.EventHandler(this.codeActivity_ExecuteCode); // // codeActivity3 // this.codeActivity3.Name = "codeActivity3"; this.codeActivity3.ExecuteCode += new System.EventHandler(this.codeActivity_ExecuteCode); // // codeActivity2 // this.codeActivity2.Name = "codeActivity2"; this.codeActivity2.ExecuteCode += new System.EventHandler(this.codeActivity_ExecuteCode); // // codeActivity1 // this.codeActivity1.Name = "codeActivity1"; this.codeActivity1.ExecuteCode += new System.EventHandler(this.codeActivity_ExecuteCode); // // activity11 // this.activity11.Activities.Add(this.codeActivity1); this.activity11.Activities.Add(this.codeActivity2); this.activity11.Activities.Add(this.codeActivity3); this.activity11.Activities.Add(this.codeActivity4); this.activity11.Name = "activity11"; // // Workflow1 // this.Activities.Add(this.activity11); this.Name = "Workflow1"; this.CanModifyActivities = false;
}
private void codeActivity_ExecuteCode(object sender, EventArgs e) { System.Console.WriteLine(((Activity)sender).Name); } } |
宿主
class Program { static void Main() { WorkflowRuntime workflowRuntime = new WorkflowRuntime(); workflowRuntime.WorkflowCompleted +=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted); workflowRuntime.WorkflowTerminated +=new EventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_WorkflowTerminated); workflowRuntime.WorkflowIdled+=new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled); WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1)); instance.Start();
System.Console.Read();
}
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e) { System.Console.WriteLine("WorkflowIdled"); }
static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e) { System.Console.WriteLine("Terminated" + e.Exception.Message); }
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e) { System.Console.WriteLine("WorkflowCompleted"); }
} |
运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)