WF4.0 自定義CodeActivity與Bookmark<第三篇>


一、自定義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結合實現會簽功能的時候,非常完美。

  詳細示例請查看<第二篇>;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM