这是工作流的入门程序,基本上每一步都有说明。学会此工作流后对其它工作流就可以触类旁通。
新建一个顺序工作流控制台程序HelloWorkflow。建好后系统默认生成Workflow1.cs文件,此为工作流文件。在Workflow1设计页面的工具箱中拖入code控件,在属生ExecuteCode中输入codeActivity1_ExecuteCode。ExecuteCode表示执行代码。如下图。
在Workflow1.cs的后台代码中编写如下代码。此工作流的目的是在控制台上显示Hello Workflow!。
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
namespace HelloWorkflow
{
public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine("Hello Workflow!");
}
}
}
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
namespace HelloWorkflow
{
public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine("Hello Workflow!");
}
}
}
工作流写好后如何调用?请看Program.cs中的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
namespace HelloWorkflow
{
class Program
{
static void Main(string[] args)
{
//承载工作流的运行时并执行刚才定义的工作流
using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
/*AutoResetEvent:用于释放单个等待线程的线程同步类。工作流实际上是在工作流运行时创建并管理的单独线程上执行的,
这样做的原因是工作流运行时必须有能力同进处理多个工作流。在本示例中,需要同步两个线程,分别是工作流线程和宿主控制台应用程序的主线程。
*/
AutoResetEvent waitHandle = new AutoResetEvent(false);
//为了让宿主控制台应用程序知道工作流何时完成,代码中订阅了workflowRuntime两个事件。事件使用了匿名委找语法
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
namespace HelloWorkflow
{
class Program
{
static void Main(string[] args)
{
//承载工作流的运行时并执行刚才定义的工作流
using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
/*AutoResetEvent:用于释放单个等待线程的线程同步类。工作流实际上是在工作流运行时创建并管理的单独线程上执行的,
这样做的原因是工作流运行时必须有能力同进处理多个工作流。在本示例中,需要同步两个线程,分别是工作流线程和宿主控制台应用程序的主线程。
*/
AutoResetEvent waitHandle = new AutoResetEvent(false);
//为了让宿主控制台应用程序知道工作流何时完成,代码中订阅了workflowRuntime两个事件。事件使用了匿名委找语法
//工作流完成事件
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e)
{
//代码会对AutoResetEvent对象发出信号,通知它释放控制台应用程序。发果发生错误,就触发WorkflowTerminated事件
waitHandle.Set();
};
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e)
{
//代码会对AutoResetEvent对象发出信号,通知它释放控制台应用程序。发果发生错误,就触发WorkflowTerminated事件
waitHandle.Set();
};
//工作流异常事件
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
//显示错误码信息,并释放等待的线程
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
//他建工作流Workflow1实列
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(HelloWorkflow.Workflow1));
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
//显示错误码信息,并释放等待的线程
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
//他建工作流Workflow1实列
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(HelloWorkflow.Workflow1));
//启动工作流Workflow1
instance.Start();
//WaitOne:阻止当前线程,直到当前 WaitHandle 收到信号。
waitHandle.WaitOne();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
}
instance.Start();
//WaitOne:阻止当前线程,直到当前 WaitHandle 收到信号。
waitHandle.WaitOne();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
}
这样一个简单的工作流就做好了。每一步解释请看代码中的注释。其它工作流的建立和运行方法与此类似。
最后运行,查看结果。