最近在学习WF, 把自己的一些学习心得放上来
Bookmark允许你以事件驱动的方式与一个Workflow内的Activity进行交互. 如果把启动一个workflow比做开始读一本书, 在Workflow中的Bookmark起到的就是和书中的Bookmark一样的作用, 就是标记现在到哪了, 以后可以从这里再继续.
但是Bookmark在原生的Activity中没有, 只能自己创建, 而且是继承自NativeActivity.
public sealed class noResultBookmark : NativeActivity //继承自NativeActivity { public InArgument<string> bookmarkName { get; set; } //创建一个输入类型参数 protected override bool CanInduceIdle //允许InduceIdle { get { return true; } } protected override void Execute(NativeActivityContext context) { string bookmark = context.GetValue(bookmarkName); //获取输入参数的值 context.CreateBookmark(bookmark); //创建Bookmark, 创建之后, 导致Workflow进入Idle状态, 引发Workflow Idle事件. 注意我们在这里没有加入Callback, 因为暂时没有返回值 System.Console.WriteLine("创建bookmark:{0}", bookmark); } }
创建好后, 就可以使用了.
接下来, 建立一个Winform, 让我们来试验一下:
启动流程的代码如下:
private void button_Run_Click(object sender, RoutedEventArgs e) { instance = new WorkflowApplication(new WFLibrary.noResultBookmarkWorkflow()); instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted); instance.OnUnhandledException = unhandledExceptionl; instance.Aborted = aborted; instance.Idle = workflowIdel; instance.Run(); }
流程启动后, 首先执行的是WriteLine Activity. 可以在控制台中看到(第一行):
接下来执行noResultBookmark Activity, 创建名为wxd的Bookmark(第二行).
创建Bookmark后, 引发了Workflow的Idle事件, 可以在控制台中看到Idle事件引发的痕迹(第三行), Workflow进入Idle状态, 执行告一段落.
然后在Winform中输入Bookmark的名字wxd, 点击触发按钮.
private void button_triggering_Click(object sender, RoutedEventArgs e) { string bookName = textBoxBookmark.Text; //获取Bookmark的名字 if (instance != null) { if (instance.GetBookmarks().Count(p => p.BookmarkName == bookName) == 1) { instance.ResumeBookmark(bookName, null); //从此Bookmark重启Workflow } else { foreach (var v in instance.GetBookmarks()) //输入的Bookmark名字不对, Workflow Instance中没有这个BookMark { System.Console.WriteLine("--------请从下面选项中选择一个BookmarkName---------------------------"); System.Console.WriteLine("BookmarkName:{0}:,OwnerDisplayName:{1}", v.BookmarkName, v.OwnerDisplayName); System.Console.WriteLine("================================"); } } } else { MessageBox.Show("没有创建实例"); } }
如果输入的Bookmark名字正确, Workflow Instance被从中断的地方唤醒, 继续下一个WriteLine Activity, 执行完后流程结束.
对Bookmark的理解, 其实最关键的地方就是, CreateBookmark会自动使Workflow进入Idle状态, 直到被ResumeBookmark唤醒.