通過本節,可以初步瞭解WF程式的特性,為以後的WF類應用開發提供一個初步的感性認識
目錄
1 流程執行個體WorkflowApplication與設計WF程式的基本原則 1
1.1 流程執行個體WorkflowApplication 1
1.2 設計WF程式的基本原則 3
1.2.1 第一步: 用WPF建立一個用於運行流程的宿主 4
1.2.2 第二步:建立一個Xaml的工作流程 5
1.2.3 第三步:運行流程 6
1.3 WF4.0與WF3.X 的運行環境對比說明(如果對WF3.X不熟悉可以忽略本節) 7
本文的兩個例子
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);
}
}
|
|