坚持学习WF(22):跟踪规则

 坚持学习WF文章索引

由于规则不是程序化的代码,你不能使用vs的调试器来调试,如果我们要调试有规则的工作流程序,我们可以开启规则引擎的Tracing功能。我们下面以一个例子来说明。我们需要建立一个顺序型工作流项目,在工作流设计器中放入一个PolicyActivity活动,然后设置其RuleSetReference属性,我们建立以下规则集。如下表所示:

Rule Conditon ThenAction ElseAction
RuleCthis.D < 100

this.B = this.B - 12
System.Console.WriteLine("RuleC:Then" + this.B)

 
RuleBthis.B > 50

this.C = "Preferred"
System.Console.WriteLine("RuleB:Then" + this.C)

this.C = "Normal"
System.Console.WriteLine("RuleB:Else" + this.C)

RuleA this.A > 10

this.B = 60
System.Console.WriteLine("RuleA:Then" + this.B)

this.B = 40
System.Console.WriteLine("RuleA:Else" + this.B)

 

规则编辑器如下图:

tracerule1

然后我们在项目中添加App.config文件,在配置文件开始规则的跟踪功能,代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>   
    <switches>
      <add name="System.Workflow.Activities.Rules" value="ALL" />
      <add name="System.Workflow LogToFile" value="1" />
    </switches>
  </system.diagnostics>
</configuration>

 

在此示例中,第二行添加节点启用文件的日志记录。该文件使用名称 WorkflowTrace.log 在宿主应用程序目录中创建。第一行中的TraceLevel属性值ALL表示所有可以预测到log信息都会被记录,如果你想过滤到一些log,你也可以指定Information和Verbose等,该选项通过将名称参数设置为等于“System.Workflow LogToTraceListener”来启用 TraceListener 的日志记录。这样设置后,Windows Workflow Foundation 将会枚举在宿主应用程序中创建的每个 TraceListener,并向它们发送所有日志记录信息。值属性的可能值包括:

说明
All记录接收到的所有消息
Off不记录任何消息
Critical仅记录关键消息
Error记录关键消息和错误消息
Warning记录关键、错误和警告消息
Information记录关键、错误、警告和提示消息
Verbose记录关键、错误、警告、提示和详细消息

 

工作流中赋响应初始值如下:

private int A = 12;
private int D = 99;
private int B = 0;
private string C = "";


下面为宿主程序代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;

namespace CaryRuleTracing
{
    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(); }; WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof
(CaryRuleTracing.Workflow1)); instance.Start(); waitHandle.WaitOne(); } } } }
  
我们现在完成项目来运行程序,得到结果如下:
 
    
 
我们打开WorkflowTrace.log看看里面都记录了什么,下面只是log中部分的记录,你可以打开该文件查看详细记录:

规则“RuleA”条件 依赖项:“this/A/”
规则“RuleA”THEN 副作用:“this/B/”
规则“RuleA”ELSE 副作用:“this/B/”
规则“RuleB”条件 依赖项:“this/B/”
规则“RuleB”THEN 副作用:“this/C/”
规则“RuleB”ELSE 副作用:“this/C/”
规则“RuleC”条件 依赖项:“this/D/”
规则“RuleC”THEN 副作用:“this/B/”
规则“RuleA”THEN 操作触发规则“RuleB”
规则“RuleA”ELSE 操作触发规则“RuleB”
规则“RuleC”THEN 操作触发规则“RuleB”
执行
计算规则“RuleA”的条件。
计算为 True 的规则“RuleA”条件。
计算规则“RuleA”的 THEN 操作。
计算规则“RuleB”的条件。
计算为 True 的规则“RuleB”条件。
计算规则“RuleB”的 THEN 操作。
计算规则“RuleC”的条件。
计算为 True 的规则“RuleC”条件。
计算规则“RuleC”的 THEN 操作。
规则“RuleC”副作用启用规则“RuleB”重新计算。
计算规则“RuleB”的条件。
计算为 False 的规则“RuleB”条件。
计算规则“RuleB”的 ELSE 操作。

 

1.Log的第一部分记录了各个规则的依赖项,当某个规则修改的时候会引擎哪些规则的重算。

2.从log我们可以看出规则的执行顺序并不是规则编辑器中设置的顺序,而是在优先级一样的情况下,按字母顺序来执行。我们例子中是RuleC,RuleB,RuleA,执行的顺序就不是了。

3.通过log我们也可以证实WF规则引擎的正向链接的特性,例子中RuleC引起了RuleB的重算。

这些只是WF中跟踪的一部分功能,我们后面后专门来学习WF中的跟踪的相关知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值