.net WCF WF4.5 状态机、书签与持久化
想看源码请直接翻到最后,使用方式如下图
如果同时需要多个书签可以直接在需要的位置创建书签,会认为是同一个实例。
若需要实现的效果是同时需要好几个部门审核,那么只要在对应的位置同时创建多个书签即可。
编写书签代码活动
注意几个地方,创建书签需要继承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","1"); 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使用相关
留待后查,同时方便他人
联系我:renhanlinbsl@163.com
联系我:renhanlinbsl@163.com