1WorkflowInvoker
使用WorkflowInvoker类中的InVoke静态方法-->WorkflowInvoker.Invoke(myWF); //myWF为自定义的workflow实例
【这种方式可以像一个函数一样顺序执行我们的工作流程,非常简单,但是在工作流执行过程中,不能与工作流实现数据的交换】
2、WorkflowApplication
调用WorkflowApplication实例的Run方法-->WorkflowApplication wfApp = new WorkflowApplication(myWF); wfApp.Run(); //myWF为自定义的workflow实例
【可以控制工作流实例长时间运行,可以在运行过程中和实例进行数据交换。但是只能执行一个的工作流实例。】
3、WorkflowServiceHost
使用WorkflowServiceHost类host起来一个服务,然后在客户端声明一个ServiceClient类的实例,用这个实例通过WCF与之前host起来的服务进行通信完成workflow的触发调用。
【WorkflowServiceHost是一个最主要的工作流主机类。可以同时管理多个工作流实例,同时控制实例的激活等操作。
支持WCF,和3.5相比有更强大的消息关联功能。当然WorkflowServiceHost也支持持久化(Persistence)和跟踪(Tracking)等功能。】
第一、二种实现方式非常简单,这里简单的用一个实例说明即可,如下所示:
<span style="font-size:18px;">namespace workflow
{
public sealed class AddActivity : CodeActivity
{
AutoResetEvent instanceUnloaded = new AutoResetEvent(false);
// 定义输入参数
public InArgument<int> number1 { get; set; }
public InArgument<int> number2 { get; set; }
//定义输出参数
public OutArgument<int> sum {get;set; }
// 如果活动返回值,则从 CodeActivity<TResult>
// 派生并从 Execute 方法返回该值。
protected override void Execute(CodeActivityContext context)
{
// 获取 Text 输入参数的运行时值
int number1 = context.GetValue(this.number1);
int number2 = context.GetValue(this.number2);
//更新输出参数
context.SetValue(sum, number2 + number1);
}
}
}</span>
<span style="font-size:18px;">namespace Test
{
class Program
{
static void Main(string[] args)
{
AutoResetEvent instanceUnloaded = new AutoResetEvent(false);
Activity activity = new AddActivity();//实例化一个流程
WorkflowApplication application = new WorkflowApplication(
activity,
new Dictionary<string, object>(){
{"number1", 12}, //参数名
{"number2", 12}, //参数名
});
#region 回调函数
application.Completed = (workflowApplicationCompletedEventArgs) =>
{
Console.WriteLine("\nWorkflowApplication has Completed in the {0} state.", workflowApplicationCompletedEventArgs.CompletionState);
};
application.PersistableIdle = (e) =>
{
return PersistableIdleAction.Unload;
};
application.Unloaded = (workflowApplicationEventArgs) =>
{
instanceUnloaded.Set();
Console.WriteLine("WorkflowApplication has Unloaded\n");
};
application.OnUnhandledException = (ex) =>
{
Console.Write("Exception");
return UnhandledExceptionAction.Terminate;
};
#endregion
application.Run(); //流程触发启动
//线程等待
instanceUnloaded.WaitOne();
Console.WriteLine("输出结束");
Console.Read();
}
}
}</span>
第三种方法没有用到,还有待研究。。。