在WF4.0中,可以使用WorkflowApplication与WorkflowInvoker创建并启动实例.
但两者在宿主中的线程方式是不一样的
使用WorkflowInvoker启动工作流时,工作流将附加到宿主的线程中执行
使用WorkflowApplication启动工作流,工作流实例将在宿主线程之外的另一个线程中运行,使用的是线程池方式
现在用实例证明:
工作流流程代码:
<span style="font-size:18px;">namespace workflow
{
public sealed class TestActivity : CodeActivity
{
// 派生并从 Execute 方法返回该值。
protected override void Execute(CodeActivityContext context)
{
for (int i = 1; i <= 10; i++)
{
System.Threading.Thread.Sleep(500);
Console.WriteLine(i);
}
}
}
}
</span>
WorkflowInvoker启动流程代码:
static void Main(string[] args)
{
Console.WriteLine("流程开始");
#region WorkflowInvoker调用代码
WorkflowInvoker.Invoke(new TestActivity());
WorkflowInvoker.Invoke(new TestActivity());
#endregion
Console.WriteLine("流程结束");
}
结果:
WorkflowApplication 启动流程代码:
<span style="font-size:18px;">static void Main(string[] args)
{
Console.WriteLine("流程开始");
workflow.TestActivity activity = new TestActivity();
WorkflowApplication application = new WorkflowApplication(activity);
WorkflowApplication application1 = new WorkflowApplication(activity);
application.Run(); //流程触发启动
application1.Run();
Console.WriteLine("流程结束");
Console.ReadKey();
}
} </span>
结果:
多线程的另一方面理解:
Main函数和工作流流程是两个线程,Main函数是主线程,工作流流程是辅线程。
现在有一种情况是,在主线程的运行期间想要运行工作流程序,针对这种情况运用的是线程阻塞,工作流运行完后,再恢复线程。代码如下:
主线程:
static void Main(string[] args)
{
AutoResetEvent instanceUnloaded = new AutoResetEvent(false);
workflow.TestActivity activity = new TestActivity();
WorkflowApplication application = new WorkflowApplication(
activity);
#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(); //流程触发启动
//线程阻塞
Console.WriteLine("主线程线程阻塞,辅线程(工作流线程)开始运行");
instanceUnloaded.WaitOne();
Console.WriteLine("主线程恢复");
Console.ReadKey();
}
辅线程(工作流流程线程还是以上的代码)
结果是: