WF4.0中加入了书签(Bookmark)机制,可以让活动在书签的位置挂起(Idel),是线程挂起,等待恢复。如果我们需要在活动没有完成的时候,提供额外的数据,这个时候我们就可以给活动注册一个书签,我们需要使用CreateNamedBookmark方法创建书签,该方法有三个参数一个名字,一BookmarkCallback的委托,当活动恢复的时候执行。和BookmarkOptions,Runtime为每个工作流实例维护一个Bookmarks的Table,每次有Bookmark要恢复的时候都回去check。
流程代码:
<span style="font-size:18px;">namespace workflow
{
public sealed class TestActivity :NativeActivity
{
#region 设置是否可以被持久化:bool CanInduceIdle { get { return true; } }
/// <summary>
/// 设置是否可以被持久化
/// </summary>
protected override bool CanInduceIdle { get { return true; } }
#endregion
// 派生并从 Execute 方法返回该值。
protected override void Execute(NativeActivityContext context)
{
//活动“workflow.TestActivity”无效。对于 NativeActivity 派生的活动,若其调用 System.Activities.NativeActivityContext 中定义的某个 CreateBookmark 重载,以便执行异步操作,则必须覆盖 CanInduceIdle 属性且返回 true。
Console.WriteLine("创建书签,终止工作流");
//创建书签
context.CreateBookmark("bookmark", new BookmarkCallback(this.Continue));
Console.WriteLine("恢复书签,流程继续");
}
void Continue(NativeActivityContext context, Bookmark bookmark, object obj)
{
//根据自己的需求,传一些值
}
}
}</span>
注意,这个函数是在BookMark创建时候的一个委托,表示在恢复Bookmark后调用的方法新建一个windows窗体
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">namespace from
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private string processInstanceID;
private WorkflowApplication application;
//启动流程并创建书签
private void button1_Click(object sender, EventArgs e)
{
TestActivity activity = new TestActivity();
application = new WorkflowApplication(activity);
processInstanceID = application.Id.ToString();
application.Run();
}
/// <summary>
/// 恢复书签
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
TestActivity activity = new TestActivity();
BookmarkResumptionResult BRR = application.ResumeBookmark(application.GetBookmarks()[0].BookmarkName, "inPut");
MessageBox.Show("Bookmark恢复执行:" + BRR.ToString());
}
}
}</span></span></span>
依次执行按钮结果为:
这几篇总结的工作流知识点比较散,下来会通过一个实例来连接起来。敬请期待。