程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WF4.0基礎篇(三) 流程實例WorkflowApplication與設計WF程序的基本原則

WF4.0基礎篇(三) 流程實例WorkflowApplication與設計WF程序的基本原則

編輯:關於.NET

通過本節,可以初步了解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);
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved