博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WF4.0:NativeActivity中的错误处理
阅读量:6717 次
发布时间:2019-06-25

本文共 2274 字,大约阅读时间需要 7 分钟。

备注:这篇文章的使用环境是.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 { 
get
set
; } 
 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 { 
get
set
; } 
 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,如需转载请自行联系原作者

 

你可能感兴趣的文章
python 回溯法 子集树模板 系列 —— 5、取物搭配问题
查看>>
1 张图秒懂 Nova 16 种操作 - 每天5分钟玩转 OpenStack(44)
查看>>
多表外连接的使用
查看>>
ORACLE rman备份之ORA-19809 ORA-19804
查看>>
《夜班医生》观后感
查看>>
SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法
查看>>
[20170315]简单探究dg的mrp进程.txt
查看>>
JQuery+CSS3实现封装弹出登录框效果
查看>>
在Visual Studio 2017中找不到.NET Framework 4.6.2
查看>>
谈长耗时任务的优化
查看>>
rpc框架之 avro 学习 2 - 高效的序列化
查看>>
回归基础性安全防护:Equifax(艾可飞)事件前车之鉴
查看>>
【妄言之言】我的2016--困境与选择
查看>>
数据库设计---关于建表的时候选择横表和竖表(纵表)的一点思考
查看>>
微信小程序开发(3) 热门电影
查看>>
二极管与、或门,三极管非门电路原理
查看>>
美图T8s真机来了!电影人像和云端AI处理是亮点
查看>>
卑不谋尊,疏不谋戚
查看>>
Docker上的MySQL:MySQL容器的单主机网络
查看>>
阿里巴巴股价大涨市值超腾讯居亚洲第一
查看>>