本文内容来自Microsoft Hands-on Labs for Windows Workflow Foundation Beta 2中的HOL01中的第二个练习,其中包括三个任务:
Ø 定义工作流的参数
Ø 修改Code Activity
Ø 运行修改好的工作流
1.打开上一个练习创建好的HelloWorldWorkflow项目,打开Workflow1.xoml顺序工作流文件,并转到查看代码。
2.找到如下代码,然后在其中添加两个属性。
public partial class Workflow1 : SequentialWorkflowActivity
{
private void codeActivity1_CodeHandler(object sender, EventArgs e)
{
Console.WriteLine("Hello, World!");
}
}
在方法codeActivity1_CodeHandler下面打“prop”按Tab键,即可由VS2005自动生成属性的格式代码。
然后使用Tab键在绿色的区域中进行切换,,输入好后使用回车键即可转到代码下面,完成一个属性的定义。
这里定义两个属性,FirstName和LastName。
3.因为例子需要控制台弹出一个Windows中的MessageBox消息提示框,所以添加System.Windows.Forms引用。
4.修改Code Activiity实例的代码。
private void codeActivity1_CodeHandler(object sender, EventArgs e)
{
System.Windows.Forms.MessageBox.Show("Hello world: " + firstName + " " + lastName);
}
5.在当前解决方案下添加一个Windows Application项目,名字为WinFormTestHost。在菜单中选择File | Add | New Project。
6.删除其中的Form1.cs和Program.cs两个文件。
7.在我们安装HOL的如下路径找到以下四个文件,使用添加现有项添加到WinFormTestHost项目中。
C:\Windows Workflow Foundation\Labs\Lab01\Resources\WinFormTestHost Files
8.将WinFormTestHost项目设置为启动项目。
9.查看Form1.cs其中的代码如下:
public partial class Form1 : Form
{
private WorkflowRuntime wr;
private string workflowAssembly = "";
private string workflowTypeName = "";
public Form1()
{
InitializeComponent();
workflowAssembly = "HelloWorldWorkflow";
workflowTypeName = "HelloWorldWorkflow.Workflow1";
}
private void btnStartWorkflow_Click(object sender, EventArgs e)
{
if (wr == null)
{
wr = new WorkflowRuntime();
wr.StartRuntime();
}
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("FirstName", txtFirstName.Text);
parameters.Add("LastName", txtLastName.Text);
WorkflowInstance instance = wr.CreateWorkflow(typeof(HelloWorldWorkflow.Workflow1), parameters);
instance.Start();
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (wr != null)
{
if (wr.IsStarted)
{
wr.StopRuntime();
}
}
}
}
(1)运行工作流需要工作流运行时的支持,所以首先定义并实例化了一个WorkflowRuntime对象。然后使用这个对象的StartRuntime方法启动运行时。
(2)定义了Dictionary<string, object>对象用来传递参数的数组。两个参数FirstName和LastName。界面如下:
(3)在往下就是创建工作流实例并执行工作流对象的代码了。
WorkflowInstance instance = wr.CreateWorkflow(typeof(HelloWorldWorkflow.Workflow1), parameters);
instance.Start();
(4)最后在窗口关闭的时候停止运行时。
10.其中用到的工作流的对象和方法,所以我们要添加几个引用:
项目HelloWorldWorkflow的引用
System.Workflow.Activities.dll
System.Workflow.ComponentModel.dll
System.Workflow.Runtime.dll
三个程序集的应用。
11.按F5运行程序,会出现上面的窗口,在两个输入框中输入相应的值点击Start Workflow按钮,就会看到一个Windows消息提示框。
至此完成第二个练习。
其中涉及到两个我自己不太明白的东东,准备查查MSDN放在下面:
WorkflowRuntime.CreateWorkflow方法
现在仅知道在顺序工作流类中建立属性后,可以通过这个方法,将参数放到Dictionary类中,创建工作流实例时给属性赋值。
MSDN中的原文:
WorkflowRuntime.CreateWorkflow Method (Type, Generic Dictionary)
Creates a workflow instance by using the specified workflow Type and the arguments to the workflow contained in the specified Dictionary.
Namespace: System.Workflow.Runtime
Assembly: System.Workflow.Runtime (in system.workflow.runtime.dll)
public WorkflowInstance CreateWorkflow (
Type workflowType,
Dictionary<string,Object> namedArgumentValues
)
Parameters
workflowType
The Type of the workflow to create.
namedArgumentValues
A Dictionary of objects keyed by string that represents the arguments to the workflow.
Return Value
A WorkflowInstance object that represents the workflow instance created.
Exceptions
Exception type |
Condition |
ArgumentNullException |
workflowType is a null reference (Nothing in Visual Basic). |
参考资料:
Microsoft Hands-on Labs for Windows Workflow Foundation Beta 2
WorkflowRuntime.CreateWorkflow Method (Type, Generic Dictionary)