Windows Workflow Foundation (WF) 會提高開發互動式長時間執行應用程式的抽象層級。 工作單元會封裝為活動。 活動在提供以下功能的環境中執行:流量控制、異常處理、錯誤傳播、狀態數據的持續性、從記憶體載入和卸載正在進行的工作流程、追蹤和事務流程。
活動架構
活動被開發為衍生自 Activity、CodeActivity、AsyncCodeActivity 或 NativeActivity 的 CLR 型別,或其具有傳回值的變體,如 Activity<TResult>、CodeActivity<TResult>、AsyncCodeActivity<TResult> 或 NativeActivity<TResult>。 開發衍生自 Activity 的活動可讓用戶組合既有的活動,以快速建立工作流程環境中執行的工作單位。 另一方面,CodeActivity 可讓執行邏輯以管理程式碼撰寫,而 CodeActivityContext 則主要用於存取活動參數。 AsyncCodeActivity 與 類似 CodeActivity ,不同之處在於可用來實作異步工作。 開發衍生自 NativeActivity 的活動可讓使用者透過 NativeActivityContext 存取運行時間,以取得排程子系、建立書籤、叫用異步工作、註冊交易等功能。
從 Activity 衍生的活動是宣告式的,這些活動可以使用 XAML 撰寫。 在下列範例中,會使用執行主體的其他活動來建立名為 Prompt 的活動。
<Activity x:Class='Prompt'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:z='http://schemas.microsoft.com/netfx/2008/xaml/schema'
xmlns:my='clr-namespace:XAMLActivityDefinition;assembly=XAMLActivityDefinition'
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns="http://schemas.microsoft.com/2009/workflow">
<z:SchemaType.Members>
<z:SchemaType.SchemaProperty Name='Text' Type='InArgument(s:String)' />
<z:SchemaType.SchemaProperty Name='Response' Type='OutArgument(s:String)' />
</z:SchemaType.Members>
<Sequence>
<my:WriteLine Text='[Text]' />
<my:ReadLine BookmarkName='r1' Result='[Response]' />
</Sequence>
</Activity>
活動內容
ActivityContext是活動作者與工作流程執行環境的介面,並可存取執行環境豐富的功能特性。 在下列範例中,活動被定義為使用執行環境來建立書籤(這是一種容許活動在其執行過程中註冊可由主機應用程式提供數據來恢復的連續點的機制)。
public sealed class ReadLine : NativeActivity<string>
{
[RequiredArgument]
public InArgument<string> BookmarkName { get; set; }
protected override void Execute(NativeActivityContext context)
{
// Create a Bookmark and wait for it to be resumed.
context.CreateBookmark(BookmarkName.Get(context),
new BookmarkCallback(OnResumeBookmark));
}
// NativeActivity derived activities that do asynchronous operations by calling
// one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext
// must override the CanInduceIdle property and return true.
protected override bool CanInduceIdle
{
get { return true; }
}
public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj)
{
// When the Bookmark is resumed, assign its value to
// the Result argument.
Result.Set(context, (string)obj);
}
活動生命週期
活動的實例會開始於Executing狀態。 除非遇到例外狀況,否則它會維持在此狀態,直到所有子活動都完成執行,而任何其他擱置中工作(Bookmark 例如,物件)都已完成,此時它會轉換為 Closed 狀態。 活動實例的父活動可以要求子活動取消。如果子活動能夠取消,則會在 Canceled 狀態中完成。 如果在執行期間擲回例外狀況,運行時會將活動放入 Faulted 狀態,並將例外狀況向上傳播至活動的父鏈結。 以下是活動的三個完成狀態:
閉: 活動已完成其工作並結束。
取消: 活動已順利終止其工作並結束。 輸入此狀態時,不會明確回復工作。
錯誤: 此活動遇到錯誤並已退出,未完成其工作。
活動在保存或載入時會保留在 Executing 狀態。