Windows Workflow
开发演练
Visual Studio 2005
中的工作流项目类型
l
顺序工作流控制台应用程序 (Sequential Workflow Console Application):创建用于生成工作流的项目,该工作流包含一个默认的顺序工作流和一个控制台测试宿主应用程序。
l
顺序工作流库 (Sequential Workflow Library):创建用于以库的形式生成顺序工作流的项目。
l
工作流活动库 (Workflow Activity Library):创建一个用来创建活动的库的项目,以后可以将其作为工作流应用程序中的构造块重用。
l
状态机控制台应用程序 (State Machine Console Application):创建用于生成状态机工作流和控制台宿主应用程序的项目。
l
状态机工作流库 (State Machine Workflow Library):创建用于以库的形式生成状态机工作流的项目。
这个例子我们完成一个最基础的工作流,在控制台上显示一些此工作流自身的信息。
这个练习我们学习工作流相关的基本操作。
新建项目,选择“顺序工作流控制台应用程序”:
从工具箱中拖一个
到设计器:
填写代码:
选择codeActivity1,点属性页,ExecuteCode属性输入方法名称showInfo,双击方法名,Visual studio自动生成方法代码框架,
填写代码:
public
sealed
partial
class
Workflow1:
SequentialWorkflowActivity
{
……
private
void showInfo(
object sender,
EventArgs e)
{
CodeActivity c = (CodeActivity)sender;
Console
.WriteLine("Hello, from '{0}'./nI'm an instance of the {1} class.",
c.Name, c.ToString());
Console.ReadLine();
}
}
运行可以看到:
这个例子我们实现一个工作流,弹出消息框,显示从主程序接收到的数据。
这个练习我们学习如何通过参数传递数据到工作流。
让我们继续分析并修改该工作流,以使其在实例化以后接收和使用数据。有两种在实例化工作流以后使其接收数据的常规方法:参数和事件。如果选择使用参数,则需要在可视化设计器中手动定义参数名称和类型的列表。如果选择使用事件,则需要创建并添加一个自定义活动(该活动充当在工作流模型中的某个位置介入的外部源),并且传入一些数据。首先我们学习参数的使用,后面我们将说明基于事件的方法。
首先为
Workflow1
添加属性
FirstName
和
LastName
:
public sealed partial class Workflow1: SequentialWorkflowActivity
{
……
private string _FirstName;
public string FirstName
{
get { return _FirstName; }
set { _FirstName = value; }
}
//{
//
数据可以保存到
UserData
中,如下:
// get { return (string)UserData["FirstName"];}
// set { UserData["FirstName"] = value; }
//}
private string _LastName;
public string LastName
{
get { return _LastName; }
set { _LastName = value; }
}
……
}
在解决方案中新建一个
windows
应用程序
WinFormHost
,设计主窗体如下:
添加引用:
生成
tbStartWorkflow_Click
事件并填写代码(代码可以从
WorkflowConsoleApplication
的
program.cs
中复制得到
):
using
System.Windows.Forms;
using
System.Threading;
using
System.Workflow.Runtime;
using
System.Workflow.Runtime.Hosting;
namespace
WinFormHost
{
public partial class Form1 : Form
{
……
private void tbStartWorkflow_Click(object sender, EventArgs e)
{
using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender1, WorkflowCompletedEventArgs e1) { waitHandle.Set(); };
workflowRuntime.WorkflowTerminated += delegate(object sender1, WorkflowTerminatedEventArgs e1)
{
Console.WriteLine(e1.Exception.Message);
waitHandle.Set();
};
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("FirstName", tbFirstName.Text);
parameters.Add("LastName", tbLastName.Text);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication6.Workflow1), parameters);
instance.Start();
waitHandle.WaitOne();
}
}
}
}
修改
Workflow1
的代码如下:
public sealed partial class Workflow1: SequentialWorkflowActivity
{
……
private void showInfo(object sender, EventArgs e)
{
System.Windows.Forms.MessageBox.Show("Welcome, " + FirstName + " " + LastName);
}
}
运行
WinFormHost:
这个例子中我们写一个自动发送Mail的工作流,其中发送Mail由我们自定义的一个Activity实现。
这个练习我们学习如何实现自定义活动。
首先新建一个工作流Activity
库:SendMail
改名:
定义属性:
To
、
From
、
Subject
、
Body
、
Host
,改写方法
Execute:
public partial class SendMailActivity: SequenceActivity
{
public String To
{
get { return _To; } set { _To = value; }
}
public String From
{……}
public String Subject
{……}
public String Body
{……}
public String Host
{……}
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
MailAddress toAddress = new MailAddress(To);
MailAddress fromAddress = new MailAddress(From);
MailAddressCollection addresses = new MailAddressCollection();
addresses.Add(toAddress);
MailMessage msg = new MailMessage(fromAddress, toAddress);
msg.Subject = Subject;
msg.Body = Body;
SmtpClient mail = new SmtpClient(Host);
mail.Cred