一、自定义CodeActivity

  CodeActivity用于自定义一段代码,可实现你自己写的任意功能。

  要注意的有两点:

  1、自定义CodeActivity必须继承自CodeActivity;
  2、Execute是你想要执行的代码,CodeActivityContext对象参数与原有工作流进行交互。

  CodeActivityContext从ActivityContext继承了如下2个常用方法:

方法/属性 说明
ActivityInstanceId 获取当前正在执行的活动实例的唯一标识符。
WorkflowInstanceId 获取当前正在执行的工作流实例的唯一标识符
GetValue() 获取指定的 Argument 的值
SetValue() 为指定的 Argument 赋值

  右键工作流项目=》新建项=>活动,可以添加一个CodeActivity。

  

  其代码如下:

    public sealed class CodeActivity1 : CodeActivity
{
//调用此自定义活动必须用一个变量接收返值
public OutArgument<string> Result { get; set; }
protected override void Execute(CodeActivityContext context)
{string input = Console.ReadLine();
//为外部工作流赋值
context.SetValue(Result, input);
}
}

  代码逻辑为,将读取到的内容为外部变量赋值。

  当完成添加之后,在左侧菜单就能够看到该控件。

  

  工作流如下:

  

  需要定义一个变量variable1,并用此设置自定义Code活动的Result属性;

  

  执行效果如下:

  

二、Bookmark

  Bookmark与CodeActivity的区别

  • 当工作流运行至Bookmark时,Bookmark会让工作流在此处挂起(Idel),是线程挂起,如果是Web请求处理程序执行,将不会返回,等待恢复。而Code不会挂起;
  • Code继承自CodeActivity,而Bookmark需继承自NativeActivity;

  设计一个Bookmark<T>如下:

    public sealed class Bookmark1<T> : NativeActivity<T>
{
public InArgument<string> InParam { get; set; }
protected override bool CanInduceIdle
{
get{ return true; }
}
protected override void Execute(NativeActivityContext context)
{
this.Result.Set(context, "结果传出");
context.CreateBookmark("Borkmark1", new BookmarkCallback(bookmarkCallback));
}
//恢复运行时的回调函数
void bookmarkCallback(NativeActivityContext context, Bookmark bookmark, object obj)
{
MessageBox.Show("恢复运行,传入的参数是:" + obj); //接收到的参数
this.Result.Set(context, (T)obj);
}
}

  新建一个工作流如下:

  

  新建一个WinFrom程序如下:

  

  其代码如下:

    public partial class Form1 : Form
{
WorkflowApplication instance = null;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
instance = new WorkflowApplication(new WorkflowConsoleApplication1.Workflow1());
instance.OnUnhandledException = unhandledExceptionl;
instance.Aborted = aborted;
instance.Idle = workflowIdel;
instance.Completed = workflowCompleted;
instance.Run();
}
private void button2_Click(object sender, EventArgs e)
{
if (instance.GetBookmarks().Count() == )
{
BookmarkResumptionResult BRR = instance.ResumeBookmark(instance.GetBookmarks()[].BookmarkName,"inPut");
MessageBox.Show("Bookmark恢复执行:" + BRR.ToString());
}
}
void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
MessageBox.Show("完成!");
}
void aborted(WorkflowApplicationAbortedEventArgs e)
{
MessageBox.Show("中止!");
}
UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)
{
MessageBox.Show("异常!");
return UnhandledExceptionAction.Cancel;
}
void workflowIdel(WorkflowApplicationIdleEventArgs e)
{
MessageBox.Show("挂起!");
}
}

  其执行效果为:

    点击启动工作流 => 弹出"挂起" => 点击恢复运行 => 弹出"Bookmark恢复运行:Success" => 弹出"恢复运行,传入的参数是inPut" => 弹出"完成"

  基本上运行一次就知道这种执行顺序了。

  BookMark是一个非常重要的工具,它能够暂停工作流的执行,让工作流进入空闲状态。这在状态机工作流中是非常有用的。尤其状态机与MVC结合实现会签功能的时候,非常完美。

  详细示例请查看<第二篇>;

WF4.0 自定义CodeActivity与Bookmark<第三篇>的更多相关文章

  1. 【转】WF4.0 (基础篇)

    转自:http://www.cnblogs.com/foundation/category/215023.html 作者:WXWinter  ——  兰竹菊梅★春夏秋冬☆ —— wxwinter@16 ...

  2. WF4.0(3)----变量与参数

    已经写了两篇关于WF4.0的博客,算是基础博客,如果是WF比较熟悉就直接跳过吧,如果你对工作流不是很熟悉,或者想了解一下基础的东西,本文还是比较适合你的.工作流中变量,参数,表达式属于数据模型中概念, ...

  3. 【转】WF4.0实战系列索引

    转自:http://www.cnblogs.com/zhuqil/archive/2010/07/05/wf4-in-action-index.html 此系列的工作流文件案例比较多点,实用性好. W ...

  4. WF4.0(2)----设计工作流

    自从做了程序员,发现自己长胖了,而且自己的身体抵抗力也出了问题,最近身体不适,公司工作任务最近也很赶,上次写了WF4.0的简介,这次就工作中工作流设计的几种方式稍微总结一下.设计工作流包括四种方式:流 ...

  5. 基于WF4.0的公文管理系统

    系统功能说明 公文管理 通过定义公文的基本信息,并将它按照工作流的定义流转实现公文的管理.包含以下功能: )公文创建:用户能够将格式化文本作为公文上传到系统中,并选择工作流启动流程. )公文审批:具有 ...

  6. cocos2d 3.0自定义事件答疑解惑

    疑惑一:在事件分发中修改订阅者 ,对于这个的理解. 事件的分发是可以嵌套的,cocos2dx使用_inDispatch来保存当前嵌套的深度,当调用第一个dispatchEvent的时候,_inDisp ...

  7. WF4.0 基础篇 (十八) Flowchar

    本节主要介绍WF4 中 Flowchart的使用 本文例子下载: http://files.cnblogs.com/foundation/FlowcharSample.rar 本文例子说明 Flowc ...

  8. AS3.0 自定义右键菜单类

    AS3.0 自定义右键菜单类: /** * 自定义右键菜单类 * 自定义菜单项不得超过15个,每个标题必须至少包含一个可见字符. * 标题字符不能超过100个,并且开头的空白字符会被忽略. * 与任何 ...

  9. WF4.0 基础篇 (一)开始使用WF

    来源:https://www.cnblogs.com/caosenianhuan/p/WF.html 最近公司要重新上线一套新的CRM系统,要重整老系统里的业务流模块,团队讨论已微软的workflow ...

随机推荐

  1. [实变函数]4.1 可测函数 (measurable function) 及其性质

    1 记号 (notations) (1) 广义实数: $\overline{\bbR}=\bbR\cup\sed{-\infty}\cup\sed{+\infty}$. (2) 本章主要考虑     ...

  2. PHP框架 Laravel Eloquent ORM 批量插入数据 && 批量更新目前没有

    foreach ($products as $v=>$a) { $count[] = array('product_name' => $a['name'], 'product_weight ...

  3. Xcode 的正确打开方式——Debugging(转载)

    Xcode 的正确打开方式——Debugging   程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode.这篇博客就主要介绍了 Xcode 中几种能 ...

  4. Python进阶09 动态类型

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢TeaEra, 猫咪cat 动态类型(dynamic typing)是Pyth ...

  5. Ubuntu设置环境变量并立即生效

    Ubuntu Linux系统包含两类环境变量:系统环境变量和用户环境变量.系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效. 修改用户环境变量 用户环境变量通常被存储在下面的文件中: ...

  6. oracle常用的数据迁移方法

    源地址:http://wenku.baidu.com/link?url=lI6UYpvDs_y8ku6DytEZLl4GSJjQ0GAGPvv8txrbRoQKgqzTCMAfBZI5mn9t-KQk ...

  7. TRUNCATE与 DELETE

    源地址:http://zhidao.baidu.com/link?url=9zB64BuXiAXNPF-zxvd6VLGTKb2FsUzQ-FsRAeQaYzycOGT5uGPXb-oB44TuYoP ...

  8. InnoSetup打包exe安装应用程序,并添加卸载图标 转

    http://blog.csdn.net/guoquanyou/article/details/7445773 InnoSetup真是一个非常棒的工具.给我的印象就是非常的精干.所以,该工具已经一步步 ...

  9. 【转】Python处理HTML转义字符

    Python处理HTML转义字符 转 [http://www.cnblogs.com/xuxn/archive/2011/08/12/parse-html-escape-characters-in-p ...

  10. Oracle常用命令1

    一. 安装是用户管理: sqlplus /nolog; connect /as sysdba; alter user sys identified by change_on_install; alte ...