博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2008-10-19 12:34  生鱼片  阅读(2218)  评论(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