一步一步学WF系列(一)——Hello world开始
6. 深入解析宿主文件
让我们进一步地去解析宿主文件Program.cs:
static void Main(string[] args)
{
using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication3.Workflow1));
instance.Start();
waitHandle.WaitOne();
}
}
WorkflowRuntime:为工作流执行引擎提供了可执行环境。
接下来,workflowRuntime.WorkflowCompleted事件和workflowRuntimeTerminated分别指定了工作流执行结束和执行终止时所调用的匿名方法。
接下来创造一个相应的工作流的实例,然后让这个实例开始执行。
而后去调用AutoResetEvent的实例waitHandle.WaitOne()作用在于阻止当前线程的执行,从而让该工作流进行结束后,即WorkflowRuntime.WorkflowComplete事件技术后,我们再可以在这条语句后来调用执行其他的语句。
没什么好说的了,接下来去创建一个工作流的实例,然后开始执行。
7. 让程序更有趣一些
分析过宿主文件之后,那我们开始让程序更有趣一些。
而手脚就让我们从那两个匿名方法开始。
首先修改workflow1.cs 的 后台代码:
public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}
private string message;
public string Message
{
get { return message; }
}
private void codeActivityHello_ExecuteCode(object sender, EventArgs e)
{
this.message = "Hello world";
}
}
当工作流执行的时候,他就给Workflow1类所实例化的对象中的Message属性赋值为Hello world。我们需要做的是将这个Message获取出来。
先让我们来看看本质,其实,在工作流的对象中,所有的属性都是以键值对的形式存储在哈希表中,因此,我们可以通过WorkflowCompleteEventArgs参数将对应的属性得到,代码如下:
string message = String.Empty;
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {
message = e.OutputParameters["Message"].ToString();
waitHandle.Set();
};
接下来,我们就可以打印出message了。
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication3.Workflow1));
instance.Start();
waitHandle.WaitOne();
Console.WriteLine(message);
8. 进一步改造程序
既然我们可以获得参数,当然也可以向工作流中传入参数。
让我们先来改造一下workflow1.cs的后台代码文件:
public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}
private string message;
public string Message
{
get { return message; }
}
private string input;
public string Input
{
set { input = value; }
}
private void codeActivityHello_ExecuteCode(object sender, EventArgs e)
{
this.message = "Hello " + input;
}
}
向工作流中传入参数其实很简单,让我们来注意一下这个方法:
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication3.Workflow1));
这个方法通过传入一个类型来实例化一个对应的工作流实例,当然,我们就是运用这个方法的重载方法去传入对应的实例:
Console.WriteLine("Please input your name:");
string input = Console.ReadLine();
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("Input", input);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication3.Workflow1),dic);
instance.Start();
waitHandle.WaitOne();
Console.WriteLine(message);
看看效果:
9. 总结
以上是工作流的最简单的一个例子,敬请关注下文。