工做流編程按部就班(1:代碼活動與時間延遲活動)

工做流編程按部就班(1:代碼活動與時間延遲活動)

做者  朱先忠

建立控制檯順序工做流示例程序框架


請遵循以下步驟建立一個控制檯順序工做流示例程序:
1. 啓動VS2008,單擊菜單」文件「|」新建「|」項目「,建立一個名字爲CodeAndDelay的控制檯順序工做流示例程序,見下圖。

2.以後,系統自動打開工做流設計器界面,如圖所示。
3. 從工具箱中依次拖動Code,Delay,Code三個活動到圖中右側的漢字提示處,獲得如圖所示的情形。
此時,圖中的三個活動相關參數都沒有通過設置,下面將設置有關參數。

爲活動建立事件或屬性


4. 對於Code活動來講,它至關於普通程序流程圖中的一段代碼模塊。所以,咱們能夠進入到此活動的ExecuteCode事件中輸入相應代碼便可。爲此,只 要雙擊圖中的圖標」codeActivity1「,系統控制轉到文件Workflow1.cs中此活動的ExecuteCode事件代碼處:

namespace CodeAndDelay
{
    public sealed partial class Workflow1 : SequentialWorkflowActivity
    {
        public Workflow1()
        {
            InitializeComponent();
        }

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            //......等待輸入你的定製代碼
        }
    }

}

建立以下簡單代碼:

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
           
Console.WriteLine("\n這裏是活動一的執行代碼,當前時間爲{0}。",DateTime.Now );
        }

5. 對於活動codeActivity2,也按上述過程操做,並建立相似於下面的代碼:

        private void codeActivity2_ExecuteCode(object sender, EventArgs e)
        {
           
Console.WriteLine("\n這裏是活動二的執行代碼,當前時間爲{0}。", DateTime.Now);
        }

6. 切換 工做流設計器界面,而後單擊選擇延遲活動圖標。在屬性窗口中設置屬性TimeoutDuration的值爲00:00:05(」時:分:秒「格式)。 由於延遲活動僅僅實現一段時間延遲功能,因此,這個活動是很是容易理解的。

至此,完成了整個工做流部分的設計工做。
很是直觀簡單!最後, 別忘記把上面文件保存一下。

最後,咱們來看一下控制檯主程序是如何建立工做流實例,並啓動工做流執行的。切換到
控制檯主程序Program.cs。此時,系統已經爲咱們自動生成了以下代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;

namespace CodeAndDelay
{
    class Program
    {
        static void Main(string[] args)
        {
            //......常常在此添加一些初始化代碼

            // 建立工做流實例,並啓動工做流執行。注意:工做流是以異步的獨立的工做線程方式執行的
            using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                AutoResetEvent waitHandle = new AutoResetEvent(false);
                workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
                workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
                {
                    Console.WriteLine(e.Exception.Message);
                    waitHandle.Set();
                };

                WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(CodeAndDelay.Workflow1));
                instance.Start();

                waitHandle.WaitOne();
            }

            //......在此常常執行一些工做流執行後的善後工做

        }
    }
}


注意:有關上面代碼中AutoResetEvent事件等的詳細討論將在後續文章中介紹。

觀察運行結果

按F5運行控制檯程序,通常順利的話,將獲得以下圖所示運行時快照。

徹底合乎意料的結果,一切盡在不言中!

備註(FROM MSDN)


DelayActivity 活動有一個InitializeTimeoutDuration 事件,它發生在
在超時持續時間開始以前發生。對於此事件,微軟的建議是:不該使用此事件來設置 DelayActivity TimeoutDuration。而應在工做流的 InitializeComponent 方法中設置超時持續時間。
相關文章
相關標籤/搜索