一、自定義CodeActivity
CodeActivity用於自定義一段代碼,可實現你自己寫的任意功能。
要注意的有兩點:
1、自定義CodeActivity必須繼承自CodeActivity;
2、Execute是你想要執行的代碼,CodeActivityContext對象參數與原有工作流進行交互。
CodeActivityContext從ActivityContext繼承了如下2個常用方法:
方法/屬性 | 說明 |
ActivityInstanceId | 獲取當前正在執行的活動實例的唯一標識符。 |
WorkflowInstanceId | 獲取當前正在執行的工作流實例的唯一標識符 |
GetValue() | 獲取指定的 Argument 的值 |
SetValue() | 為指定的 Argument 賦值 |
右鍵工作流項目=》新建項=>活動,可以添加一個CodeActivity。
其代碼如下:
public sealed class CodeActivity1 : CodeActivity { //調用此自定義活動必須用一個變量接收返值 public OutArgument<string> Result { get; set; } protected override void Execute(CodeActivityContext context) {string input = Console.ReadLine(); //為外部工作流賦值 context.SetValue(Result, input); } }
代碼邏輯為,將讀取到的內容為外部變量賦值。
當完成添加之后,在左側菜單就能夠看到該控件。
工作流如下:
需要定義一個變量variable1,並用此設置自定義Code活動的Result屬性;
執行效果如下:
二、Bookmark
Bookmark與CodeActivity的區別
- 當工作流運行至Bookmark時,Bookmark會讓工作流在此處掛起(Idel),是線程掛起,如果是Web請求處理程序執行,將不會返回,等待恢復。而Code不會掛起;
- Code繼承自CodeActivity,而Bookmark需繼承自NativeActivity;
設計一個Bookmark<T>如下:
public sealed class Bookmark1<T> : NativeActivity<T> { public InArgument<string> InParam { get; set; } protected override bool CanInduceIdle { get{ return true; } } protected override void Execute(NativeActivityContext context) { this.Result.Set(context, "結果傳出"); context.CreateBookmark("Borkmark1", new BookmarkCallback(bookmarkCallback)); } //恢復運行時的回調函數 void bookmarkCallback(NativeActivityContext context, Bookmark bookmark, object obj) { MessageBox.Show("恢復運行,傳入的參數是:" + obj); //接收到的參數 this.Result.Set(context, (T)obj); } }
新建一個工作流如下:
新建一個WinFrom程序如下:
其代碼如下:
public partial class Form1 : Form { WorkflowApplication instance = null; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { instance = new WorkflowApplication(new WorkflowConsoleApplication1.Workflow1()); instance.OnUnhandledException = unhandledExceptionl; instance.Aborted = aborted; instance.Idle = workflowIdel; instance.Completed = workflowCompleted; instance.Run(); } private void button2_Click(object sender, EventArgs e) { if (instance.GetBookmarks().Count() == 1) { BookmarkResumptionResult BRR = instance.ResumeBookmark(instance.GetBookmarks()[0].BookmarkName,"inPut"); MessageBox.Show("Bookmark恢復執行:" + BRR.ToString()); } } void workflowCompleted(WorkflowApplicationCompletedEventArgs e) { MessageBox.Show("完成!"); } void aborted(WorkflowApplicationAbortedEventArgs e) { MessageBox.Show("中止!"); } UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e) { MessageBox.Show("異常!"); return UnhandledExceptionAction.Cancel; } void workflowIdel(WorkflowApplicationIdleEventArgs e) { MessageBox.Show("掛起!"); } }
其執行效果為:
點擊啟動工作流 => 彈出"掛起" => 點擊恢復運行 => 彈出"Bookmark恢復運行:Success" => 彈出"恢復運行,傳入的參數是inPut" => 彈出"完成"
基本上運行一次就知道這種執行順序了。
BookMark是一個非常重要的工具,它能夠暫停工作流的執行,讓工作流進入空閑狀態。這在狀態機工作流中是非常有用的。尤其狀態機與MVC結合實現會簽功能的時候,非常完美。
詳細示例請查看<第二篇>;