通過本節,可以初步了解WF程序的特性,為以後的WF類應用開發提供一個初步的感性認識
本文的兩個例子
http://files.cnblogs.com/foundation/LoadXamlSample.rar
http://files.cnblogs.com/foundation/WorkflowApplicationSample.rar
流程實例WorkflowApplication與設計WF程序的基本原則
流程實例WorkflowApplication
我在[開始使用WF4.0.]中創建一個"hello wxwinter"屏幕的輸出的工作流的例子
在這個例子中我們使用如下方式啟動了該流程
class Program
{
static void Main(string[] args)
{
WorkflowInvoker.Invoke(new Workflow1());
}
}
在實際應用中,我並不使用WorkflowInvoker.Invoke方式創建工作流(WorkflowInvoker的功能我會在以後的文章中詳細介紹),我會用 WorkflowApplication創建工作流實例, WorkflowApplication用於跟蹤和管理單個工作流實例,先看一下WorkflowApplication的結構:
類名 System.Activities.WorkflowApplication 文件 System.Activities.dll 結構說明 繼承 WorkflowInstance 是一個 sealed類 功能說明 通過從構造函數傳入Activity對象,創建一個工作流的實例
WorkflowApplication提供了很多管理實例的屬性與方法,今天先介紹一下Completed屬性
Action<WorkflowApplicationCompletedEventArgs> Completed { get; set; }
當工作流完成時,會調用該屬性所指定的 System.Action<T>委托
委托參數WorkflowApplicationCompletedEventArgs:
ActivityInstanceState CompletionState
IDictionary<string, object> Outputs
Exception TerminationException
Guid InstanceId
IEnumerable<T> GetInstanceExtensions<T>() where T :
下面的代碼使用WorkflowApplication方式運行流程
class Program
{
static void Main(string[] args)
{
// WorkflowInvoker.Invoke(new Workflow1());
//創建實例
WorkflowApplication instance = new WorkflowApplication(new Workflow1());
//當實例運行完成時調用的方法
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
//打印實例ID
System.Console.WriteLine(instance.Id);
//啟動實例
instance.Run();
System.Console.Read();
}
static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
System.Console.WriteLine("狀態:{0}",e.CompletionState.ToString());
System.Console.WriteLine("實例編號:{0}", e.InstanceId);
}
}
設計WF程序的基本原則
很多時候,初學者學習WF時都使用[Workflow Console Application]這個項目模板
以至於學習了很久,許多Activity也使用的很熟練了,但就是無法理解WF究竟該怎樣應用到實際項目中.
其實[Workflow Console Application]這個項目模板僅僅是用於初學者練習的,WF有兩種創建流程的方式:
1.用類創建流程,[Workflow Console Application]這個項目模板就是這種方式
2. 用XML格式字符串創建流程
由於WF設計的目的就是靈活,所以用XML格式字符串創建流程的方式才能體現這一點,下面我就用一個例子來演示一下用XML格式字符串創 建流程的方式,
第一步: 用WPF創建一個用於運行流程的宿主
建立一個[WFHost]的WFP項目,將解決方案命名為[LoadXamlSample]
添加[System.Activities]類的引用
添加一個名為[run]的文本框(AcceptsReturn="True"),添加一個名為[runButton]的按鈕, 為[runButton]添加[Click]事件
private void runButton_Click(object sender, RoutedEventArgs e)
{
System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding();
byte[] bs = utf8.GetBytes(this.xamlTextBox.Text);
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(bs);
Activity activity = ActivityXamlServices.Load(memoryStream);
WorkflowApplication myInstance = new WorkflowApplication(activity);
myInstance.Run();
}
為了能看到控制台輸出,要將項目的輸出類型設為[Console Application]
第二步:創建一個Xaml的工作流
用文本文件創建Xaml工作流是痛苦的工作,在沒為大家講解開發流程設計器之前,我們先用VS2010創建一個流程
創建一個名為[wxwinterWorkflow]的[Activity Library]項目
設計一個如下流程
得到流程的xaml字串
第三步:運行流程
運行[WFHost]程序,將上步得到的xaml字符串粘貼到文本框中,點擊[run]按鈕,會在控制台看到"hello wxwinter"的輸出
將文本框中的<WriteLine Text="hello wxwiter" />改為<WriteLine Text="hello wxd" />,點擊 [run]按鈕,會在控制台看到"hello wxd"的輸出
WF4.0與WF3.X 的運行環境對比說明(如果對WF3.X不熟悉可以忽略本節)
WF3.X與WF4運行環境最明顯的變化是,在WF3.X中要創建實例要使用WorkflowRuntime的CreateWorkflow方法.
而在WF4中,不需要顯示創建一個[WorkflowRuntime],而是直接使用[WorkflowInstance (bate1中)] 創建,這也是到了bate2中將 [WorkflowInstance ]改名為[WorkflowApplication]的原因
class Program
{
static void Main(string[] args)
{
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(wxwinterActivity));
instance.Start();
System.Console.Read();
}
}
public class wxwinterActivity : System.Workflow.ComponentModel.Activity
{
protected override System.Workflow.ComponentModel.ActivityExecutionStatus Execute (System.Workflow.ComponentModel.ActivityExecutionContext executionContext)
{
System.Console.WriteLine("wxd");
return base.Execute(executionContext);
}
}