WF4.0 自定义CodeActivity与Bookmark<第三篇>
2024-10-17 23:53:07
一、自定义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结合实现会签功能的时候,非常完美。
详细示例请查看<第二篇>;
最新文章
- 关于Webstorm的一些配置
- opencv6.1-imgproc图像处理模块之平滑与形态学操作
- hbase的查询scan功能注意点(setStartRow, setStopRow)
- SQL 表 和字符串 互转 (行列互转)
- Codeforces Round #249 (Div. 2)
- android中ListView_SimpleAdapter
- .bss 段 block started symbol
- eclipse 每次切换工作空间都要重新配置
- Visual Studio vs2010 去掉中文注释红色下划线;去掉代码红色下划线;
- UVA 12545 Bits Equalizer
- ubuntu设置静态ip
- BZOJ 2683: 简单题(CDQ分治 + 树状数组)
- bzoj 2821 作诗 分块
- QEMU KVM Libvirt手册(10):Managing Virtual Machines with libvirt
- ASP.NET 管道
- 密码正确 mysql无法登陆 red7.3 上安装mysql5.6后登录报错ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using passswd :yes)
- SQL格式化插件—SQL Pretty Printer
- 项目配置linux上, 配置文件访问不到
- java 学习------JDK1.8安装与配置
- Android requestCode的限制