WF4.0:NativeActivity中的错误处理

备注:这篇文章的使用环境是.NET framework 4.0 RC 1

在WF4中创建native活动时,NativeActivity是非常强大的。其众多的功能之一是围绕错误处理。

调度子活动的时的基本错误处理。

    当NativeActivity执行的时候,它是通过一个NativeActivityContext实例,这个实例通过使用ScheduleActivity()函数来调度其他活动。ScheduleActivity()函数有几个重载,其中一个使用了FaultCallback。当执行被调度的子活动发生一些异常时,就会调用FaultCallback。调用错误处理函数需要一组参数,这些参数包括NativeActivityFaultContext和未处理的异常。该NativeActivityFaultContext包含一个用于错误处理的HandleFault()函数。考虑到工作流的异步特性,最直接的一个try / catch块是行不通。

    因此,我希望下面活动能捕获任何异常,然后继续。

复制代码
 1     public sealed class MyActivity : NativeActivity 
 2     {
 3         public Activity Body { getset; } 
 4         protected override void Execute(NativeActivityContext context)
 5         { 
 6             context.ScheduleActivity(Body, FaultHandler);
 7         } 
 8         private void FaultHandler(NativeActivityFaultContext faultContext, Exception propagatedException, ActivityInstance propagatedFrom)
 9         {
10             Console.WriteLine(propagatedException.Message);
11             faultContext.HandleFault(); 
12         }
13     }
复制代码

不要使用此代码,它有一个严重的错误!

让我们通过执行下面的工作流测试一下这段代码:

复制代码
 1         private static Activity CreateWorkflow() 
 2         { 
 3             return new Sequence 
 4             { 
 5                 Activities =
 6                 { 
 7                     new WriteLine { Text = "Start outer sequence." },
 8                     new MyActivity 
 9                     { 
10                         Body = new Sequence
11                         { 
12                             Activities = 
13                             { 
14                                new WriteLine { Text = "Start inner sequence." },
15                                new Throw 
16                                {
17                                    Exception = new InArgument<Exception>(ctx => new DivideByZeroException())
18                                },
19                                new WriteLine { Text = "End inner sequence." } 
20                             }
21                         }
22                     }, 
23                      new WriteLine { Text = "End outer sequence." }
24                 } 
25             }; 
26         }
复制代码

对于这个工作流,我期待下面这样的输出:

但实际情况是别的东西,我会收到以下输出:

 

即使异常被上级捕获,我们可以看到第二个内部的WriteLine仍然执行了!

这种现象让我们想起了臭名昭著VB6 On Error Resume Next ,当某语句出现错误时,跳过它,执行下面一行的代码。

这并不是我真正期待和希望的。修复很容易。所需要做的是使用CancelChild()函数明确取消正在执行的子活动。下面是NativeActivity的正确版本。

复制代码
 1    public sealed class MyActivity : NativeActivity 
 2     {
 3         public Activity Body { getset; } 
 4         protected override void Execute(NativeActivityContext context)
 5         { 
 6             context.ScheduleActivity(Body, FaultHandler);
 7         } 
 8         private void FaultHandler(NativeActivityFaultContext faultContext, Exception propagatedException, ActivityInstance propagatedFrom)
 9         {
10             Console.WriteLine(propagatedException.Message);
11             faultContext.HandleFault();
12             faultContext.CancelChild(propagatedFrom);
13         }
14     }
复制代码






本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/03/11/error-handling-in-a-nativeactivity.html,如需转载请自行联系原作者

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员提高建议之踏踏实实“扎马步”

踏踏实实“扎马步” 今天无意中看了“校长”的“程序员&司机”&#xff0c;其中谈到了关于程序员速成的问题。其实速成班毕业的“系统杀手”早已在遍布大江南北&#xff0c;只是在互联网时代&#xff0c;互联网的应用型软件生命周期越来越短&#xff0c;业务驱动主导…

c语言scanf返回值

1. scanf 函数是有返回值的&#xff0c;它的返回值可以分成三种情况1) 正整数&#xff0c;表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b);如果用户输入"3 4"&#xff0c;可以正确输入&#xff0c;返回2&#xff08;正确输入了两个变量…

gpgga格式读取MATLAB,GPS编码格式及读取.doc

GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中。前面的代码只负责从串口接收数据并将其放置于缓存&#xff0c;在没有进一步处理之前缓存中是一长串字节流&#xff0c;这些信息在没有经过分类提取之前是无法加以利用的。因此…

Cadence 电源完整性仿真实践(二)

转载于:http://blog.csdn.net/wu20093346/article/details/38050917 通过以上步骤对每个平面进行了单节点分析并观测了响应曲线&#xff0c;接下来将观测平面对的目标阻抗是否满足要求&#xff0c;通过选择电容器的方法来减小含有电容器阻抗响应曲线中的反谐振波峰。在SigWave窗…

Johnson 全源最短路径算法

解决单源最短路径问题&#xff08;Single Source Shortest Paths Problem&#xff09;的算法包括&#xff1a; Dijkstra 单源最短路径算法&#xff1a;时间复杂度为 O(E VlogV)&#xff0c;要求权值非负&#xff1b; Bellman-Ford 单源最短路径算法&#xff1a;时间复杂度为 O…

单循环链表中设置尾指针比设置头指针更好的原因

尾指针是指向终端结点的指针&#xff0c;用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便。 设一带头结点的单循环链表&#xff0c;其尾指针为rear&#xff0c;则开始结点和终端结点的位置分别是rear->next->next和rear,查找时间都是O(1)。 若用头指…

为何大部分人成不了技术专家?

此文为我在CSDN的新的SNS里看到的&#xff0c;感触很深&#xff0c;和大家分享一下.里面的许多人的观点都让我受益匪浅。 如果你是项目经理&#xff0c;产品经理或者架构师&#xff0c;我真诚邀请你加入 如果你还是学生或者还是初学者&#xff0c;我建议你先等等&#xff0c;…

Machine Learning 学习笔记1 - 基本概念以及各分类

What is machine learning? 并没有广泛认可的定义来准确定义机器学习。以下定义均为译文&#xff0c;若以后有时间&#xff0c;将补充原英文...... 定义1、来自Arthur Samuel&#xff08;上世纪50年代、西洋棋程序&#xff09; 在进行特定编程的情况下给予计算机学习能力的领域…

值传递与地址传递

值传递与地址传递的区别&#xff1a;两者其实传递的都是一个内存单元的内容。不同的是&#xff0c;值传递传递的内容是一个变量的值&#xff0c;得到这个值后&#xff0c;对这个值的修改不能改变原变量的值&#xff1b;而地址传递传递的是一个变量的地址&#xff0c;得到传递的…

蒙特 卡罗方法matlab,蒙特·卡罗方法中的数学之美,你一定不想错过

原标题&#xff1a;蒙特卡罗方法中的数学之美&#xff0c;你一定不想错过有方教育——我们致力于为中学生提供学界和业界前沿的学术科研教育内容&#xff0c;帮助学生参加海外科研项目&#xff0c;在提升申请竞争力的同时&#xff0c;获得领跑优势。一、概述蒙特卡罗方法(Monte…

【 CDN 最佳实践】CDN 命中率优化思路

CDN 在静态资源的加速场景中是将静态资源缓存在距离客户端较近的CDN 节点上&#xff0c;然后客户端访问该资源即可通过较短的链路直接从缓存中获取资源&#xff0c;而避免再通过较长的链路回源获取静态资源。因此 CDN的缓存命中率的高低直接影响客户体验&#xff0c;而保证较高…

职场新人的入门法则:少想、多做、立即执行!

对于刚进入职场的新人来说&#xff0c;要想在工作中快速获得成长&#xff0c;唯一办法就是&#xff1a;“少想&#xff0c;多做&#xff0c;立即执行&#xff01;”。 少想不等于盲目&#xff0c;在保证工作思路绝对清晰的同时&#xff0c;执行力越高&#xff0c;执行速度越快…

Python基础-time and datetime

一、在Python中&#xff0c;通常有这几种方式来表示时间&#xff1a; 时间戳格式化的时间字符串元组&#xff08;struct_time&#xff09;共九个元素。由于Python的time模块实现主要调用C库&#xff0c;所以各个平台可能有所不同。1.时间戳&#xff08;timestamp&#xff09;的…

实际应用中带头节点的线性链表

/*带头节点的线性链表类型*/ typedef char ElemType//结点类型 typedef struct LNode {char data;struct LNode *next; }*Link,*Position;//链表类型 typedef struct {Link head,tail;int len; }LinkList;/**/ /*一些在其他函数定义中会调用的函数*/ /**//*---compare---比较两…

matlab中欧姆如何表示,在excel中欧姆符号怎么打

在excel中欧姆符号怎么打&#xff0c;相信对于好多熟练用excel的朋友来说&#xff0c;是很简单不过的&#xff0c;但是对于有些初学者来说&#xff0c;就是菜鸟啦&#xff0c;就有点懵懵懂懂的感觉了&#xff0c;毕竟刚接触的东西还没用过嘛。但是&#xff0c;没关系今天笔者就…

原生js系列之DOM工厂模式

写在前面 如今&#xff0c;在项目中使用React、Vue等框架作为技术栈已成为一种常态&#xff0c;在享受带来便利性的同时&#xff0c;也许我们渐渐地遗忘原生js的写法。 现在&#xff0c;是时候回归本源&#xff0c;响应原始的召唤了。本文将一步一步带领大家封装一套属于自己的…

武术与软件设计 - 简单即是最好

偶然间在公车上看见一个讲中国功夫的特辑&#xff0c;说道香港武打片的发展历程&#xff0c;当然就不得不提起李小龙先生&#xff0c;我们知道他截拳道的威力&#xff0c;这时候我记得在看李小龙传奇时他所说的一些话&#xff0c;当他和美国一个高手比武后他输了&#xff0c;最…

matlab的概述,Matlab概述

MATLAB(矩阵实验室)是数字计算&#xff0c;可视化和编程的第四代高级编程语言和交互式环境。MATLAB是由MathWorks开发的。它允许矩阵操纵&#xff0c;绘制功能和数据; 实现算法; 创建用户界面; 与其他语言编写的程序(包括C语言&#xff0c;C&#xff0c;Java和FORTRAN)进行交互…

形参和实参

形参&#xff1a;全称为“形式参数”是在定义函数名和函数体的时候使用的参数&#xff0c;目的是用来接收调用该函数时传递的参数。形参的作用是实现主调函数与被调函数之间的联系&#xff0c;通常将函数所处理的数据&#xff0c;影响函数功能的因素或者函数处理的结果作为形参…

sizeof和strlen的区别

strlen——get the length of a string.size_t strlen(const char *string);Each ofthese functions returns the number of characters instring, notincluding the terminating null character.//函数返回string里的字符数&#xff0c;不包括终止字符\0sizeofThe sizeof keyw…