随笔 - 234, 文章 - 12, 评论 - 1671, 阅读 - 74万
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

坚持学习WF(25):取消容器(CancellationHandlerActivity)

Posted on   生鱼片  阅读(2219)  评论(6编辑  收藏  举报

[置顶]坚持学习WF文章索引

CancellationHandlerActivity 活动包含在所有复合活动的子项活动完成执行之前所取消复合活动的清理逻辑。 在WF中比较常见的就是ListenActivity 活动,ConditionedActivityGroup 活动和ParallelActivity活动,可以具有同时执行的多个子分支活动。 在所有子活动完成执行之前,某个特定条件(如到达的消息)可以导致整个活动立即关闭。 然后,父活动取消执行所有未完成的子活动,并调用其相应的 CancellationHandlerActivity 活动,以执行其中定义的清除逻辑。

1.我们就以ParallelActivity为例来说明如何使用该活动,我们新建立一个顺序型工作流项目,工作流设计如下图:

cancel1

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.执行结果如下:
cancel2 

编辑推荐:
· 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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示