准备工作:
1、添加System.Activity.DurableInstancing.dll和SystemRuntime.DurableInstanceing.dll的引用。
2、新建数据库WF45GettingStartedTutorial
运行C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en下的
数据库中的表如下:
1、新建14WinFormWFDemo项目,在此项目下新建Form1窗体应用程序,BookMarkDemoCodeActivity代码活动,DemoActivity状态工作流。
2、BookMarkDemoCodeActivity代码活动继承自NativeActivity,而非CodeActivity。并重写Execute方法,CanInduceIdle属性(标示该工作流是否可以停顿)。
默认情况下,代码活动继承于CodeActivity类,而本例中我们使用的是NativeActivity<TResult>,因为CodeActivity<TResult> 并不支持使用书签。 NativeActivity 是一个带有受保护的构造函数的抽象类。 与 CodeActivity 一样, NativeActivity 用于通过实现Execute(NativeActivityContext) 方法来编写命令性行为。 与 CodeActivity 不同的是,通过传递给 Execute(NativeActivityContext) 方法的 NativeActivityContext 对象, NativeActivity 有权访问工作流运行时的所有公开的功能。
在使用ReadInt之前需要重新生成解决方案。
代码如下:
public sealed class BookMarkDemoCodeActivity : NativeActivity
{
// 定义一个字符串类型的活动输入参数
public OutArgument<int> day { get; set; }
// 如果活动返回值,则从 CodeActivity<TResult>
// 派生并从 Execute 方法返回该值。
protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark("Demo",new BookmarkCallback(SetResult));
}
//ResultBook将会执行此代码,winForm窗体中的值将会被送入wf中。
private void SetResult(NativeActivityContext context, Bookmark bookMark, object value)
{
context.SetValue(day, Convert.ToInt32(value));
}
//wf 可否停顿
protected override bool CanInduceIdle
{
get
{
return true;
}
}
}
}
3、状态机工作流的设计
4、Form1窗体的设计
5、Form1后代代码
public partial class Form1 : Form
{
bool isCorrent = false;
public Form1()
{
InitializeComponent();
}
WorkflowApplication wfApp = null;
/// <summary>
/// WorkflowApplication的配置信息
/// </summary>
private void Init()
{
wfApp = new WorkflowApplication(new BookMarkDemoCodeActivity());
wfApp.Idle += a =>
{
MessageBox.Show("wf 停下了");
Console.WriteLine("wf 停下了");
};
wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e2)
{
MessageBox.Show("wf 持久化");
Console.WriteLine("wf 持久化");
return PersistableIdleAction.Unload;
};
wfApp.Unloaded += a =>
{
MessageBox.Show("wf 卸载");
Console.WriteLine("wf 卸载");
};
wfApp.OnUnhandledException += a =>
{
MessageBox.Show("wf 遇到异常");
Console.WriteLine("wf 遇到异常");
return UnhandledExceptionAction.Terminate;
};
wfApp.Aborted += a =>
{
MessageBox.Show("wf 终止");
Console.WriteLine("wf 终止");
};
wfApp.Completed += a =>
{
if (a.CompletionState == ActivityInstanceState.Canceled)
{
Console.WriteLine("Cancled");
}
else if (a.CompletionState == ActivityInstanceState.Faulted)
{
Console.WriteLine("Faulted");
}
else
{
isCorrent = true;
}
};
//创建一个保存工作流实例的SqlStore对象
SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(@"Data Source=DAN-PC;Initial Catalog=WF45GettingStartedTutorial;Integrated Security=True");
wfApp.InstanceStore = store;
}
private void btnStart_Click(object sender, EventArgs e)
{
Init();
wfApp.Run();
txtWorkflowID.Text = wfApp.Id.ToString();
Clipboard.SetText(this.txtWorkflowID.Text);
}
private void btnContinnute_Click(object sender, EventArgs e)
{
Init();
wfApp.Load(Guid.Parse(txtWorkflowID.Text.ToString()));
wfApp.ResumeBookmark("Demo", Convert.ToInt32(this.txtNumber.Text));
}
}