CancellationHandlerActivity 活动包含在所有复合活动的子项活动完成执行之前所取消复合活动的清理逻辑。 在WF中比较常见的就是ListenActivity 活动,ConditionedActivityGroup 活动和ParallelActivity活动,可以具有同时执行的多个子分支活动。 在所有子活动完成执行之前,某个特定条件(如到达的消息)可以导致整个活动立即关闭。 然后,父活动取消执行所有未完成的子活动,并调用其相应的 CancellationHandlerActivity 活动,以执行其中定义的清除逻辑。
1.我们就以ParallelActivity为例来说明如何使用该活动,我们新建立一个顺序型工作流项目,工作流设计如下图:
ParallelActivity活动有两个分支,我们在第二个分支中使用ThrowActivity活动抛出一个异常,导致整个工作流终止,此时ParallelActivity的第一个分支会执行取消操作。我们在sequenceActivity1活动中的取消处理程序中添加一个codeCancel活动来编写我们自己的逻辑处理程序,代码如下:
private void codeCancel_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("取消活动执行了"); }
2.sequenceActivity1中的while的条件为true,整个工作流的代码如下:
public sealed partial class ExCancelWorkflow: SequentialWorkflowActivity { public ExCancelWorkflow() { InitializeComponent(); } private void codeCancel_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("取消活动执行了"); } private void whileCon(object sender, ConditionalEventArgs e) { e.Result = true; } private void codeLeft_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("左边活动执行了"); } private void codeRight_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("右边活动执行了"); } }
3.宿主程序的代码如下:
class Program { static void Main(string[] args) { using(WorkflowRuntime workflowRuntime = new WorkflowRuntime()) { AutoResetEvent waitHandle = new AutoResetEvent(false); workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { waitHandle.Set(); }; workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { Console.WriteLine("工作流终止:" + e.Exception.Message); waitHandle.Set(); }; Console.WriteLine("---开始执行工作流---"); WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(CaryExceptionDemo.ExCancelWorkflow)); instance.Start(); waitHandle.WaitOne(); Console.WriteLine("---第一个工作流执行结束---"); Console.WriteLine(); } } } 4.执行结果如下:
作者:生鱼片
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:
WF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构