活动的条件有两种:代码条件和声明性规则条件。如果我们改变了代码条件我们需要重新编译我们的工作流程序才可以。由于声明行规则条件是序列化到.rules文件中的,所以我们可以动态的更新,下面举例说明:
我们建立一个顺序型工作流控制台程序,工作流设计如下图:
然后分别设置分支条件(均为声明性规则条件)如下:
ifElseBranchActivity1:条件名--ifBranch1,表达式--this.conditonNum == 1。
ifElseBranchActivity2:条件名--ifBranch2,表达式--this.conditonNum == 2。
工作流代码如下:
using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Collections; using System.Drawing; using System.Linq; using System.Workflow.ComponentModel.Compiler; using System.Workflow.ComponentModel.Serialization; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.Runtime; using System.Workflow.Activities; using System.Workflow.Activities.Rules; namespace CaryUpdateCondition { public sealed partial class ConditonWorkflow: SequentialWorkflowActivity { public ConditonWorkflow() { InitializeComponent(); } public int conditonNum { get; set; } private void codeActivity1_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("第一个分支执行了"); } private void codeActivity2_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("第二个分支执行了"); } private void codeActivity3_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("第三个分支执行了"); } } }
我们设计宿主程序如下:
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(); }; workflowRuntime.WorkflowCreated += new EventHandler<WorkflowEventArgs>
(workflowRuntime_WorkflowCreated); Console.WriteLine("--第一个工作流执行开始--"); Dictionary<String, Object> argNum= new Dictionary<string, object>(); argNum.Add("conditonNum", 1); WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof
(CaryUpdateCondition.ConditonWorkflow),argNum); instance.Start(); waitHandle.WaitOne(); Console.WriteLine("--第一个工作流执行结束--"); Console.WriteLine(); Console.WriteLine("--第二个工作流执行开始--"); Dictionary<String, Object> argNum2 = new Dictionary<string, object>(); argNum2.Add("conditonNum", 2); WorkflowInstance instance2 = workflowRuntime.CreateWorkflow(typeof
(CaryUpdateCondition.ConditonWorkflow), argNum2); instance2.Start(); waitHandle.WaitOne(); Console.WriteLine("--第二个工作流执行结束--"); } }
如果这个时候我们执行工作流,和我们以前的没什么区别,程序会执行codeActivity1和codeActivity2,我们现在要在运行时动态更改活动的条件,什么时候做更新我们在WF中的动态更新 一文有详细的说明。我们注册WorkflowRuntime的Created事件。在该事件中做更改。代码如下:
private static Boolean firstWF = true;
private static void ModifyRules(WorkflowEventArgs e) { WorkflowChanges wc = new WorkflowChanges(e.WorkflowInstance.GetWorkflowDefinition()); RuleDefinitions rds = (RuleDefinitions)wc.TransientWorkflow.GetValue
(RuleDefinitions.RuleDefinitionsProperty); if (rds != null) { if (rds.Conditions.Contains("ifBranch1")) { RuleExpressionCondition condition= rds.Conditions["ifBranch1"]
as RuleExpressionCondition; CodeBinaryOperatorExpression codeExpression =condition.Expression
as CodeBinaryOperatorExpression; codeExpression.Right = new CodePrimitiveExpression(0); ValidationErrorCollection errors = wc.Validate(); if (errors.Count == 0) { try {e.WorkflowInstance.ApplyWorkflowChanges(wc);} catch (Exception ex) { Console.WriteLine("动态更新异常: {0}",ex.Message); } } else { foreach (ValidationError error in errors) { Console.WriteLine(error.ToString()); } } } } firstWF = false; }
现在我们再次运行程序,由于我们在上面的程序中将ifElseBranchActivity1的条件this.conditonNum == 1。右面
的表达式改为了0,结果如下:
我们在上面的程序中在运行时对ifElseBranchActivity1的条件做了更改,从结果中也看到更改生效,我们还可以在
运行时替换整个.rules文件,这样我们就可以在外部集中管理工作流的规则条件,我们现在将原来的自动生成的.rules
文件拷贝一份,重名为ReplaceRules.rules,然后把该文件中以下部分做更改,同样是将ifElseBranchActivity1
的条件this.conditonNum == 1,右面的表达式改为了0:
<ns0:CodeBinaryOperatorExpression.Right> <ns0:CodePrimitiveExpression> <ns0:CodePrimitiveExpression.Value> <ns1:Int32 xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089">0</ns1:Int32> </ns0:CodePrimitiveExpression.Value> </ns0:CodePrimitiveExpression> </ns0:CodeBinaryOperatorExpression.Right>
实际中我们不会这样做,我们会通过规则编辑器来设置我们的规则,我们在运行时替换该规则文件,程序如下:
private static void ReplaceRules(WorkflowEventArgs e) { WorkflowChanges wc = new WorkflowChanges(e.WorkflowInstance.GetWorkflowDefinition()); Stream stream = new FileStream(@"ReplaceRules.rules", FileMode.Open,
FileAccess.Read, FileShare.Read); using (XmlReader xmlReader = XmlReader.Create( new StreamReader(stream))) { WorkflowMarkupSerializer markupSerializer= new WorkflowMarkupSerializer(); RuleDefinitions ruleDefinitions= markupSerializer.Deserialize(xmlReader)
as RuleDefinitions; if (ruleDefinitions != null) { wc.TransientWorkflow.SetValue(RuleDefinitions.RuleDefinitionsProperty,ruleDefinitions); ValidationErrorCollection errors = wc.Validate(); if (errors.Count == 0) { try { e.WorkflowInstance.ApplyWorkflowChanges(wc);} catch (Exception ex) { Console.WriteLine("动态更新异常: {0}",ex.Message); } } else { foreach (ValidationError error in errors) { Console.WriteLine(error.ToString()); } } } } firstWF = false; }
发表评论
-
平淡的2007
2007-12-24 08:04 813早上起来,送女朋友去公交车站,然后回来赶紧打开电脑,先 ... -
DreamSpark发布,高校学生免费使用Visual Studio 2008 Professional Edition 等微软软件
2008-02-20 13:23 1410今天上网无意中搜索到学生可以免费使用VS2008专业版,后来又 ... -
坚持学习WF(1):从HelloWorld开始
2008-04-04 16:30 887[置顶]坚持学习WF文章索 ... -
坚持学习WF(2):WF创作模式和设计时工具
2008-04-05 17:19 633[置顶]坚持学习WF文章索 ... -
坚持学习WF(3):WF框架概览
2008-04-08 07:27 781[置顶]坚持学习WF文章索 ... -
坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty)
2008-04-12 00:01 1141[置顶]坚持学习WF文章索引 活动(Activity) 活动 ... -
坚持学习WF(5):自定义活动(CustomActivity)
2008-04-13 15:25 918当WF提供的标准活动不能满足我们的需求的时候,我们就需要定义自 ... -
MOSS点滴(1):如何开发和部署feature
2008-04-16 21:35 834Features 是MOSS 2007以开箱即用的一套新功能, ... -
MOSS点滴(2):自定义Application Page
2008-04-19 20:07 841在MOSS中后台管理的页面都是Application Pag ... -
坚持学习WF(6):开发可复用的宿主程序
2008-04-21 21:45 692我们之前写工作流宿主 ... -
MOSS点滴(3):说说MOSS中的母版页
2008-04-25 21:15 1176MOSS中有两种页面:Site P ... -
MOSS点滴(4):实现Form认证
2008-04-29 21:12 701本文主要参考了网上的一些文章,但有些文章有些地方说的不是很明确 ... -
坚持学习WF(7):流程控制(Flow Control)
2008-04-30 18:10 828本文主要说说WF中和流 ... -
坚持学习WF(8):本地服务之调用外部方法
2008-05-09 08:17 754WF提供了一组核心服务 ... -
MOSS中的WebPart开发
2008-05-10 13:53 1054由于在asp.net1.1的时候asp.net中还没有webp ... -
坚持学习WF(9):本地服务之事件处理
2008-05-28 07:49 792[置顶]坚持学习WF文章索引 一:先来介绍两个活动 Even ... -
坚持学习WF(10):在工作流中使用关联
2008-06-01 13:03 686[置顶]坚持学习WF文章索 ... -
坚持学习WF(11):工作流通信与队列
2008-06-07 15:45 729[置顶]坚持学习WF文章索引 WF 提供的通信模型是构建于 ... -
MOSS中创建自定义内容类型
2008-06-12 20:23 1098一:简要介绍 某类内容 ... -
.NET中IDisposable接口的基本使用
2008-06-15 12:01 944首先来看MSDN中关于这个接口的说明: [ComVisible ...
相关推荐
3. **状态管理**:使用Vuex或其他状态管理工具来管理活动数据和当前活动的状态,确保组件正确地被加载和更新。 4. **路由配置**:结合Vue Router,根据活动ID动态配置路由,确保活动页面的正确跳转和加载。 5. **...
MyBatis的动态SQL功能使开发者可以根据条件动态生成SQL,减少了大量模板代码。 在功能实现上,活动添加功能允许管理员发布新的活动,包括活动名称、时间、地点等详细信息。评论功能让用户可以对活动发表看法,增强...
【知识点详解】 Simulink是MATLAB环境中的一个强大的建模仿真工具,它允许用户通过图形化界面构建复杂的系统模型。...这种方法在数字样机开发中非常有用,能够有效地测试和验证控制系统在不同条件下的行为。
每次迭代都以当前参数值为条件,从而更新每个参数的取值,最终得到一系列样本,这些样本可以用来近似参数的后验分布。 文章中提到的Markov Chain Monte Carlo方法(马尔可夫链蒙特卡洛方法),是一种基于随机抽样的...
### 设备更新最佳时期决策方法研究 #### 一、引言 随着技术的进步和市场需求的变化,设备更新成为了企业持续...正确地运用这些决策方法,可以帮助企业在合适的时机进行设备更新,从而确保生产活动的高效性和经济性。
描述中的内容与标题相同,暗示着压缩包内的“生产动态表.xlsx”可能是一个设计精良的Excel工作簿,用于实时反映生产活动的状态。下面我们将详细探讨Excel在生产管理中的应用及其相关知识点。 **Excel在生产管理中的...
贝叶斯动态因子模型是一种统计方法,用于处理经济数据,并从中提取经济条件的即时度量和预测。该模型特别适用于在面临数据修订或需要单维度经济活动指标时的场景。 首先,贝叶斯动态因子模型采用贝叶斯理论框架对...
8. **后台管理系统**:模板可能还包含一个后台管理系统,用于管理员监控活动进展、处理捐款、更新活动信息等。后台系统应具有用户管理、数据分析、消息推送等功能,便于活动的高效运营。 综上所述,这个中国电信...
6. **动态更新**:Excel表格的灵活性允许实时更新数据,当物料价格变动或需求变化时,可以快速调整报价。 7. **公式和函数**:Excel中的公式和函数(如SUM、AVERAGE等)可以帮助快速计算总价、平均价,以及进行成本...
【可更新资源受限的工期-费用权衡问题】是指在项目调度中,除了考虑传统的不可更新资源(如人力、设备等)的限制外,还要处理可更新资源(如原材料、能源等)的动态变化和限制。这些可更新资源在项目执行期间可能会...
2. **动态看板**:动态看板通常是指能够实时更新的数据展示面板,这在电商销售管理中非常有用,可以帮助管理者即时了解业务状况,比如每日的销售业绩、库存状况、调货需求等。 3. **时间序列分析**:数据按日期排列...
3. 动态实施岩土工程监测:在勘察和工程实施过程中,动态监测岩土体的状态变化,如地表沉降、边坡位移、地下水位等,及时发现和处理问题。 4. 加强煤田地质灾害研究:对可能的地质灾害进行深入研究,并提出针对性的...
系统提供了创建、编辑、删除活动的功能,支持上传活动详情、设定报名条件、时间安排等。同时,活动报名、签到等流程也被自动化,大大减轻了组织者的工作负担。活动管理系统还可以生成统计报告,帮助分析活动参与情况...
它会引用`style.css`来应用样式,并可能通过JavaScript或jQuery来处理动态更新进度条、处理用户交互等逻辑。 总的来说,活动预购样式HTML的设计和实现涉及多方面的Web开发技能,包括HTML语义化、CSS布局与美化以及...
这种固定的工作流模式难以应对业务流程的动态变化,尤其是业务流程变得越来越复杂、控制步骤和流转规则的不确定性增大,以及业务环境和外部条件频繁变更时,传统的固定工作流往往导致流转失败,使得业务流转停滞或回...
5. 数据统计与展示:投票结果需要实时更新并展示给用户,PHP可以与MySQL等数据库配合,动态生成投票结果图表。 二、抽奖活动设计 1. 抽奖逻辑:抽奖活动的核心是随机算法。PHP的mt_rand()或rand()函数可用于生成...
这一过程涉及到自然环境变化、人类经济活动以及土地资源的多种属性,如数量、利用状况、权属、条件和质量。 自然环境的演变,如全球变暖、海平面上升、植被演替、自然灾害(如荒漠化和崩滑流),这些都会导致土地...
其次,"修改节点"意味着用户可以改变现有流程中的步骤或决策属性,例如节点的名称、描述、执行条件等。这样的功能使得流程可以根据业务变化快速适应,提高了流程管理的动态性。 "删除节点"功能则允许用户移除不再...
3. **更新逻辑**:为了实现动态效果,我们需要在`Engine`的`onComputeFrame()`方法中更新粒子的状态。这可能包括计算新的位置、大小、透明度等属性,以及处理碰撞和边界条件。 4. **性能优化**:由于壁纸会持续运行...