WF中的动态更新

关于动态更新

在开发工作流时,我们会在工作流设计器中通过拖拽活动,设置属性等等来设计我们的工作流,我们希望我们在设计时定义好的工作流在运行时是不变的。但在实际中我们往往需要在运行时来改变工作流的架构,例如我们已经定义好的流程在没有结束时我们需要增加一个流程点,这个时候我们就需要使用动态更新来现实。在WF中我们也可以对正在运行的工作流实例添加删除活动,修改活动,规则条件等。当动态更新应用到工作流实例上时,只影响当前的工作流实例。其他的和将来的都不受影响,仍然使用原始的工作流定义。

动态更新不适合要进行整体更改的情况,因为这将导致工作流与原始设计原则产生极大差别。 在此类情况下,应设计一个新的工作流,而不是对正在运行的实例进行更改。动态更新不必重新编译和重新启动工作流。

何时进行动态更新

我们可以从工作流的执行线程内部和外部对正在运行的工作流实例进行动态更新。 在内部,我们可以使用CodeActivity,自定义活动等来实现,由于工作流运行在单一的线程上,所以我们执行动态更新的时候不会有其他的活动在执行。 在外部,我们实现动态更新就有严格规定,主要有以下状态可以在宿主程序中进行动态更新:

1. 工作流实例创建完成,但是没有开始。
2. 工作流实例是挂起状态,没有恢复。
3. 工作流实例是空闲状态。

我们可以在WorkflowRuntime的WorkflowCreated,WorkflowSuspened,WorkflowIdled事件中来完成动作更新。WorkflowCreated事件在workflowRuntime.CreateWorkflow方法调用后引发,使用使用SuspendActivity可以使工作流转到挂起状态,引发WorkflowSuspened事件。使用DelayActivity或HandleExternalEventActivity时工作流会进入Idle状态,引发WorkflowIdled事件。

动态更新的一般步骤

我们通过以下几个步骤进行动态更新:

1.所有对运行中工作流实例的建议的更改必须使用WorkflowChanges对象进行。首先我们要创建一个该类的实例,构造函数中需要需要传递被更改的工作流实例的根活动。如果你是使用内部实现动态更新的方式,你直接传递this关键字就可以了。如果你是在外部宿主程序中,你需要使用workflowinstance的GetWorkflowDefinition方法来获取工作流实例的根活动。

2.WorkflowChanges对象被创建后。该对象的TransientWorkflow属性返回该工作流实例的克隆版本,我们会对该克隆版本进行更改,然后将更改应用到运行中的工作流实例。

3.我们需要找到你要添加或删除活动的父活动,可以使用CompositeActivity的Activities属性或是使用GetActivityByName方法来确定父活动,然后使用Add或Insert方法来添加或插入新的活动。移除活动使用remove方法。

4.使用WorkflowChanges的Validate方法来验证,如果有错误会返回ValidationError对象集合。

5.验证通过后就可以更新了,如果是在外部实现动作更新需要调用workflowinstance对象的ApplyWrokflowChange方法,内部的话就调用当前对象的ApplyworkflowChanges方法。

阻止动态更新

顺序和状态机工作流都有一个DynamicUpdateCondition属性,如果你没有设置该属性工作流一直允许动态更新,当你设置了该属性后,当你在调用ApplyWorkflowChanges方法时就会去计算,如果为true则允许进行动态更新,否则就会抛出异常。

动态更新实例

下面我们分别使用在工作流内部和外部两种方式来举例说明,首先我们建立一个顺序型工作流控制台程序,工作流设计如下图:

DynamicUpdate1

工作流代码如下:

public sealed partial class CaryDynamicUpdateWorkflow: SequentialWorkflowActivity
{
    public CaryDynamicUpdateWorkflow()
    {
       InitializeComponent();
    }

    private void beforeSequence_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("beforeSequence执行了");
    }
    private void afterSequence_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("afterSequence执行了");
    }
    private void IsUpdate(object sender, ConditionalEventArgs e)
    {
        e.Result = true;
    }       
}

我们会在运行时给该工作流中的sequenceActivityContainer添加一个自定义活动PrintActivity,该自定义活动仅仅向控制台输出一条语句,代码如下:

public partial class PrintActivity : System.Workflow.ComponentModel.Activity
{
 public PrintActivity()
 {
     InitializeComponent();
 }

 protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
 {
    Console.WriteLine("自定义Print活动");
    return base.Execute(executionContext);
 }
}
1.宿主程序中,首先我们在workflowRuntime的WorkflowCreated事件中执行动态更新.代码如下:
static void workflowRuntime_WorkflowCreated(object sender, WorkflowEventArgs e)
{
    WorkflowChanges wc = new WorkflowChanges(e.WorkflowInstance.GetWorkflowDefinition());
    CompositeActivity sequenceContainer = wc.TransientWorkflow.GetActivityByName
        ("sequenceActivityContainer") as CompositeActivity;
    if (sequenceContainer != null)
    {
        PrintActivity print = new PrintActivity();
        sequenceContainer.Activities.Add(print);
        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());
            }
        }
} }

2.运行程序后得到如下图结果:

DynamicUpdate2

3.从上图可以看出我们自定义的PrintActivity活动在运行时添加到了工作流实例当中,以上我们是在宿主程序中执行动态更新的,我们也可以在工作流内部来完成,例如我们将动态更新的代码放到我们重写的Initialize方法中,我们只要将如下代码做更改即可:

WorkflowChanges wc = new WorkflowChanges(e.WorkflowInstance.GetWorkflowDefinition());
try { e.WorkflowInstance.ApplyWorkflowChanges(wc); }

改为:
WorkflowChanges wc = new WorkflowChanges(this);
try { this.ApplyWorkflowChanges(wc); }

运行程序你可以得到和上面一样的结果。
 
4.如果你将工作流的DynamicUpdateCondition属性设为false,此时做动态更新时会抛出异常,如下图:
 
 

EtherCAT主站SOEM -- 0 -- 该EtherCAT主站SOEM专栏后续安排 SOEM(Simple Open EtherCAT Master)是一个开源的EtherCAT主站库,允许开发者构建自定义的EtherCAT主站应用程序。EtherCAT是一种实时以太网通信协议,广泛应用于工业自动化和机器控制领域。开源性质:SOEM是一个开源项目,这意味着开发者可以自由地查看、修改和分发代码。这使其成为工业自动化领域的一个强大工具,可以根据具体需求进行定制。EtherCAT主站实现:SOEM库提供了一个完整的EtherCAT主站实现,允许主站与多个EtherCAT从站设备进行通信。 阅读详情

相关推荐

影像组学分析流程中,图像分割前要做的事(图像预处理)

在InputVolume中无法找到自己想要重采样的序列,这时可以检查一下序列的Volume type是不是MRMLMulti。这时,Volume type将由MRMLMulti改为Scaler,随后即可在3D slicer中完成Resample Scaler Volume。2.1、重采样:通过3Dslicer中的Resample Scaler Volume实现。具体设置参数:spacing(1,1,1),Interpolation选择Bspline。2、图像预处理:重采样和标准化。

weixin_45011313的博客 3724

WWF3动态修改工作流<第九篇>

WWF3动态修改工作流<第九篇> 一、动态添加或移除工作流活动   首先添加一个顺序的空白工作流。      然后添加一个Winform程序,界面如下:      代码如下: namespace WinForm { publi...

ajwqb06628的专栏 174

AD21导出gerber文件

文件–>制造输出–>Gerber Files 文件–>制造输出–>Gerber Files 通用、光圈和高级跟第一步一样 3.文件–>制造输出–>NC Drill Files 这个默认就可以了 主要参考视频来自bilibili添加链接描述 此篇博客主要是写给自己好记的,无其他商业用途 ...

新手小杨 1万+

再次发布修改的workflow后,workflow没有更新

最近使用SharePoint Designer开发workflow时,发现一个郁闷的问题,就是发布修改后的workflow后,workflow并没有更新,现将解决方法记录如下:     如果你使用的是win7系统的话,     1. 关闭SharePoint Designer;     2. 打开如下路径:%SystemDrive%\Users\%user%\AppData\Local\Mi

zhoulu001的专栏 1113

HFSS仿真平行线定向耦合器学习笔记

材料:FR4(玻璃纤维环氧树脂),介电常数:4.4,损耗角正切:0.02,厚度0.8mm。扫频方式:快速扫频,扫频范围:1.0GHz~3.0GHz,步进:0.01GHz。端口2是端口1关于Y轴对称,端口3,端口4是端口1和端口2关于X轴对称得到。求解中心频率:2.0GHz,迭代次数:20,收敛误差为0.02。右键设置边界条件----辐射边界。激励方式:集总端口激励。

qq_36521926的博客 4491

Anaconda报错no qt platform plugin could be initialized

今天因为在anaconda中安装了一个新包,安装成功后运行python 程序报错:no qt platform plugin could be initialized。 1.安装Anaconda3-4.2.0-Windows-x86_64,对应python版本为3.5.2,scikit learn版本是0.17。因为要用Isolation Forest算法,只有0.18以上版本scikit learn才包含此算法,所以想更新scikit learn。 conda install scikit-lear

zhang1806618的博客 1万+

WF _WebFilterIsActive returning NO并且Can't Add Self as Subview 崩溃解决办

错误提示如下: WF: _userSettingsForUser mobile: { filterBlacklist = ( ); filterWhitelist = ( ); restrictWeb = 1; useContentFilter = 0; useContentFilterOverrides = 0; whitelistEnabled = 0; } WF: _We...

weixin_34292402的博客 878

避坑指南:英飞凌TC3XX的MCMCAN初始化常见错误及解决方法

本文针对英飞凌TC3XX系列MCU的MCMCAN模块初始化难题,深入剖析了寄存器配置时序、总线监控模式误用、中断映射错误及Message RAM地址冲突四大常见陷阱。通过实战代码示例和诊断流程,提供了清晰的避坑指南和解决方案,帮助嵌入式开发者高效解决CAN FD通信故障,确保汽车电子与工业控制项目的稳定运行。

weixin_29193259的博客 246

WKWebView _WebFilterIsActive returning: NO

写这篇文是因为在UIWebView加载页面的时候有时候会返回: filterBlacklist = ( ); filterWhitelist = ( ); restrictWeb = 1; useContentFilter = 0; useContentFilterOverrides = 0; whitel...

weixin_30362801的博客 4634

从爱好者到工程师:如何低成本体验RFSoC ZU47DR?性能实测与避坑指南

本文详细介绍了如何低成本体验赛灵思RFSoC ZU47DR芯片,包括二手开发板选购、租赁服务、精简开发环境搭建等实用方案。通过性能实测与避坑指南,帮助爱好者和工程师在有限预算下充分利用这款集成了ARM处理器和FPGA的高性能芯片,降低开发门槛。

weixin_42525005的博客 221

WSL2 Ubuntu复现FoundationPose项目(docker)

复现一个基于深度学习的物体姿态估计框架FoundationPose项目,使用docker,WSL2

woaidawangwang的博客 2000

iOS10下在UIWebView加载的页面, WF: _WebFilterIsActive returning: NO

UIWebView加载的网址链接是我们后台做的一个pdf文件转H5的链接, 测试发现在iOS9系统上可以正常加载网页内容, 但是很奇怪到iOS10系统上就无法加载, 会出现以下Log信息, WF: _userSettingsForUser mobile: {     filterBlacklist =     (     );     filterWhitelist =     (   

Sooober的博客 3万+

运行 ui5 serve 命令行报错的处理方法

如果大家运行 ui5 serve 命令行,报如下的错误消息: ui5 不是内部或外部命令,也不是可运行的程序: 只需要执行命令行,全局安装 ui5 cli(command line interface)这个命令行工具即可: npm install --global @ui5/cli 这个 ui5 cli 的入口执行文件,实际安装在了我 Node.js 的安装目录下: 更多Jerry的原创文章,尽在:“汪子熙”: ...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1343

Windows WorkFlow Foundation入门(五)

WF中的错误处理       WF中的错误是以异步的方式来处理的。在活动中显式或隐式的抛出异常后,工作流运行时引擎会将捕捉到的异常先保存到队列中,在之后的时间再进行处理。这与一般的异常处理方式不同在于,如果一个异常在try{}语句块中被抛出,在相应的catch{}语句块中无法截获该错误,同时该错误也不会立即抛出给用户。  异常的起因      以下几种情况可能会产生异常 原子事务...

weixin_33913377的博客 159

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WF4.0实战(十六):模拟红绿灯

概述: 在我眼里,每天马路上的红绿灯闪呀闪的,也是一个流程,这个流程是一个反复的流程。这个流程算从红灯开始吧,然后是黄灯,然后是绿灯,然后又是黄灯,接着回到红灯。这个流程是反复的。黄灯是个过度,时间相对较短,红灯和绿灯时间较长,所以,很多人称交通灯为红绿灯,而不是红黄绿灯。这个例子使用...

chenqunan3231的博客 109

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

WF 绘制图片的部分

前段时间要自定义控件  用WF做一个Slider  背景是用贴图的  因此为了显示出好的效果 就需要贴图  通过调节值来控制图片的显示部分 在这里做了一个垂直显示的控制  运行效果如下: 后台处理代码如下:   public partial class Form1 : Form     {         int DrawHeight = 0;         Imag

SANYUNI的专栏 583

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

WF框架编程目录

出处:http://www.cnblogs.com/lodestar/archive/2008/03/29/1129147.html说明:应朋友之邀整理了WF的部分知识点,今年的项目全是JAVA的,希望有机会能再深入研究WF Wf框架编程简介2第一部分:基础知识3一、工作流模式1编程模型1.1过程控制模型1.2C#控制流程的问题1.3工作流模式2 WFMC的标准体系结构和工作流参考模型2.1 WF...

编程开发资料库 195

Windows Workflow Foundation(1)- Windows Workflow Foundation 概述

Windows Workflow Foundation(第一章)- Windows Workflow Foundation 概述 工作流概述 活动(Activity)是工作流的基本单元,用于描述实际进程。工作流(workflow)提供了一种方法,用于描述多项短期运行或长期运行的工作之间的执行顺序和依赖关系。此工作从头到尾地贯穿模型,并且活动可以人工执行或由系统功能执行。 工作流运行...

afgvkab3084的博客 1768

【亲测免费】 Unlit_WF_ShaderSuite:为你的项目增添动态与艺术感

Unlit_WF_ShaderSuite:为你的项目增添动态与艺术感 项目介绍 Unlit_WF_ShaderSuite,也被称为UnlitWF/UnToon,是一款专为Unity设计的创新型Unlit着色器套件。它以直接渲染纹理为基础,通过添加多种视觉效果,将传统的Unlit着色器升级为功能强大的Toon着色器。无论是光源响应、NormalMap、MetallicMap还是Matcap效果,Un...

gitblog_00866的博客 408

WF in .Net 4.5 提高

转:http://blog.sina.com.cn/s/blog_4c0e8aa20100xfn2.html WF in .Net 4.5 在.Net 4.5 的框架中,工作流基础(WF)添加了一些新的功能,这些新的功能包括: 1. 创建状态机工作流的能力(在3.5中存在状态机,但在4.0 中就不常用来,在4.5种突然又出现,不知道会有什么好处)。 2. 增强的工作流设计器功能类如下

jackljf的专栏 880

.net框架版本说明

.NET框架 1.0、.NET框架 1.1、.NET框架 2.0、.NET框架 3.0、.NET框架 3.5、.NET框架 4.00 .netframework3.0Windows Presentation Foundation(WPF):提供更佳的用户体验,用来开发Windows Forms程序以及流览器应用程序.Windows Communication Foundation(WCF):提供S...

weixin_34248023的博客 187

update去空处理

update wf_task_info   assignee=#{assignee},   assignee_name=#{assigneeName},   distribution_user=#{distributionUser},   distribution_date=#{distributionDate},   updated_by=#{updatedBy},   upda

NEOU2的博客 795

CURSOR 游标中动态表查询

--今天需要删除项目下面的所有发包,每个发包都有不同的类型,每个类型又有不同表,所以就遇到了动态FOR select表的情况declare @PROJECT_ID varchar(50),@tablename varchar(50), @wf_b_id varchar(50),@wfid varchar(20),@Sql varchar(500) set @PROJECT_ID='P2012

fenyuxiao的专栏 1064

如何使用JavaScript更新图表数据

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34376986的博客 140

使用FusionCharts创建可更新数据的JavaScript图表

先创建一个简单的图表,然后改变它的数据(请参见下面的代码)。图表最初据显示8月份的销售数据,当用户点击按钮时改为显示9月份的销售数据。每个月都有单独的XML文件,代码如下: <html> <head> <title>Update Chart data</title> <script type="text...

weixin_30342827的博客 130
上一篇: 使用本地服务异步执行自定义活动业务逻辑
下一篇: 参加Tech.ED2008(微软技术大会)上海站
fdqwfdsafdsa
博客等级 码龄18年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值