想看源码请直接翻到最后,使用方式如下图

如果同时需要多个书签可以直接在需要的位置创建书签,会认为是同一个实例。

若需要实现的效果是同时需要好几个部门审核,那么只要在对应的位置同时创建多个书签即可。

编写书签代码活动

注意几个地方,创建书签需要继承NativeActivity,随之要修改的就是Execute的参数类型

如下所有注释部分

public sealed class BookmarkActivity : NativeActivity
{
// 定义一个字符串类型的活动输入参数
public InArgument<string> Text { get; set; }
public OutArgument<string> bookMark{get;set;} // 如果活动返回值,则从 CodeActivity<TResult>
// 并从 Execute 方法返回该值。 //2.修改上下文类型
protected override void Execute(NativeActivityContext context)
{
// 获取 Text 输入参数的运行时值
string text = context.GetValue(this.Text); //3.创建书签并设置书签恢复会的回调函数
context.CreateBookmark("name", new BookmarkCallback(final));
}
//4.重写CanInduceIdle
protected override bool CanInduceIdle
{
get
{
return true;
}
}
//5.通过恢复书签时自动调用此函数来将书签传递给外部变量
protected void final(NativeActivityContext context,Bookmark bookmark,object obj)
{
Dictionary<string, object> o = (Dictionary<string, object>)obj;
context.SetValue(bookMark, context.ActivityInstanceId);
}

1.使用WorkflowApplication启动活动

//与主线程同步
AutoResetEvent syncEvent = new AutoResetEvent(false); var act = new Activity1();
Dictionary<string, object> dictionary = new Dictionary<string, object>();
dictionary.Add("pic","");
WorkflowApplication app = new WorkflowApplication(act, dictionary);
//运行活动
app.Run();
//等待信号
syncEvent.WaitOne();

 2.持久化的sql路径

C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en 


 3.添加程序集


 3.添加引用

using System.Activities.DurableInstancing;

4.在合适位置绑定数据持久化使用的数据库

SqlWorkflowInstanceStore store =
new SqlWorkflowInstanceStore(@"Server=DESKTOP-OIGV51O\SQLEXPRESS;database=WFTest;uid=sa;pwd=123");
//绑定数据库
app.InstanceStore = store;

到这一步数据库中便已经能够查看到数据了,接下来要在需要的位置获取我们的书签

 5.继续执行后续步骤

            //继续执行

            //此处使用数据库中工作流的ID,而不是使用书签名
app.Load(Guid.Parse(textBox2.Text)); app.ResumeBookmark(textBox1.Text,null);

6.绑定生命周期事件

#region 工作流生命周期事件
app.Unloaded = delegate (WorkflowApplicationEventArgs er)
{
Console.WriteLine("工作流 {0} 卸载.", er.InstanceId);
};
app.Completed = delegate (WorkflowApplicationCompletedEventArgs er)
{
//textBox1.Text = er.Outputs["arg1"].ToString();
syncEvent.Set();
};
app.Aborted = delegate (WorkflowApplicationAbortedEventArgs er)
{
Console.WriteLine("工作流 {0} 终止.", er.InstanceId);
};
app.Idle = delegate (WorkflowApplicationIdleEventArgs er)
{ Console.WriteLine("工作流 {0} 空闲.", er.InstanceId);
syncEvent.Set(); //这里要唤醒,不让的话,当创建了一个书签之后,界面就卡死了。
};
app.PersistableIdle = delegate (WorkflowApplicationIdleEventArgs er)
{
var bookmarks = er.Bookmarks;
var instanceID = er.InstanceId;
//textBox1.Text = er.["arg1"].ToString();
Console.WriteLine("持久化");
return PersistableIdleAction.Unload;
};
app.OnUnhandledException = delegate (WorkflowApplicationUnhandledExceptionEventArgs er)
{
Console.WriteLine("OnUnhandledException in Workflow {0}\n{1}",
er.InstanceId, er.UnhandledException.Message);
return UnhandledExceptionAction.Terminate;
};
#endregion

代码:下载

上一篇:.net WCF WF4.5    下一篇:WCF使用相关

.net WCF WF4.5 状态机、书签与持久化的更多相关文章

  1. .net WCF WF4.5

    花了两天时间学习使用WF,把一些遇到的问题记录下来,使用的环境是VS2017,网上的资料普遍太老了 需要注意,如果使用多项目同时启动的方式需要把WCF调整到WF启动顺序之上 1.怎么使用代码活动 新建 ...

  2. WCF使用相关

    1.不显示WCF服务主机 在WCF项目属性中的WCF选项卡总关闭下图的选项 2.在其他项目中承载WCF服务 其他加载的操作一致,需要把WCF的endpoint和behavior节点复制到 启动服务的那 ...

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

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

  4. 工作流模式 (zhuan)

    http://www.cnblogs.com/soundcode/archive/2010/12/30/1922283.html *********************************** ...

  5. IPython+:一个交互式计算和开发环境

    一. IPython基础 代码自动补全:Tab键 可补全内容包括:变量名.函数名.成员变量函数.目录文件 内省(Itrospection) 在变量名之前或之后加上问号(?),这样可以显示这个对象的相关 ...

  6. jupyter notebook :一个交互式计算和开发环境

    一. IPython基础 代码自动补全:Tab键 可补全内容包括:变量名.函数名.成员变量函数.目录文件 内省(Itrospection) 在变量名之前或之后加上问号(?),这样可以显示这个对象的相关 ...

  7. IPython的使用技巧

    ?打印IPython简介 在IPython中直接输入?,可以打印出IPython的功能介绍 object ?内省功能 在变量后面加上?,可以打印出该变量的详细信息.例如图中一个列表对象,打印出该对象的 ...

  8. WF4 持久化 <第四篇>

    一.基础示例 WF4 默认支持SQLServer的持续化,首先要执行目录C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en下的脚本: SqlPer ...

  9. [WF4.0 实战] WPF + WCF + WF 打造Hello World(基础篇)

    本篇博客是一个基础的演示样例,也就是一个新手教程吧!让大家熟悉一下WPF + WCF + WF三者的关系!这仅仅是一个基础篇,下篇会继续深入,作为这段时间研究工作流的一个小小总结! 三者关系: WPF ...

随机推荐

  1. 2802:小游戏利用bfs来实现

    之前使用的是递归的方法来解决的问题,后来有点想用bfs(宽度优先搜索来尝试一下的想法,在网上看到有人使用了dfs(深度优先搜索)更加坚定了自己的这种想法. 这个方法首先是以顶点的四组开始,加入那些没有 ...

  2. LeetCode算法题-Two Sum II - Input array is sorted

    这是悦乐书的第179次更新,第181篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第38题(顺位题号是167).给定已按升序排序的整数数组,找到两个数字,使它们相加到特定 ...

  3. Java反射机制小结和实际操作

    一.什么是反射 1.编译和运行 在了解什么是Java反射机制前,先聊聊Java的编译和运行. 还记得第一次使用记事本编写第一个Java程序的场景吗?通过命令窗口,使用javac命令编译一个.java文 ...

  4. Java 过一下基础

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  5. Go学习笔记05-指针

    目录 参数传递 var a int = 2 var pa *int = &a *pa = 3 fmt.Println(a) Go语言中 指针不能运算 参数传递 不像C++.Java.Pytho ...

  6. MonkeyRunner测试工具小结

    一.MonkeyRunner介绍: MonkeyRunner是Google提供的一个基于坐标点的Android黑盒自动化测试工具.Monkeyrunner工具提供了一套API让用户/测试人员来调用,调 ...

  7. 6.02-news_re

    import re import requests url = 'http://news.baidu.com/' headers = { "User-Agent": 'Mozill ...

  8. 002_关于six版本过低报cannot import name urllib_parse的问题

    一. 参考:https://github.com/Parsely/pykafka/issues/222 [root@jyall.com tmp]#python check.py #报错如下 Trace ...

  9. python3 练习题 day03

    ''' 1. 文件a1.txt内容 序号 部门 人数 平均年龄 备注 1 python 30 26 单身狗 2 Linux 26 30 没对象 3 运营部 20 24 女生多 ....... 通过代码 ...

  10. java可重入锁reentrantlock

    public class ReentrantDemo { //重入锁 保护临界区资源count,确保多线程对count操作的安全性 /*public static ReentrantLock rtlo ...