1 爲什麼使用多線程
我們知道,WorkflowInvoker對象不支持多線程,當前任務和工作流流程共用一個線程,這樣就造成了一種現象,我們在同一時間只能執行一件事,當前的業務和工作流的創建運行不能同時進行,降低了程序的執行效率,並且用戶體驗也不好;鑑於此,WF提供了WorkflowApplication對象以支持多線程,這樣,我們的業務程序和工作流操作可以同時進行了,提高了程序執行效率,用戶體驗較好。
2 代碼實現
//非繼承自定義控件類,需要繼承底層類
class naTiveActivityTest : NativeActivity
{
//定義兩個輸入參數和一個輸出參數
public InArgument<int> input1 { get; set; }
public InArgument<int> input2 { get; set; }
public OutArgument<int> output { get; set; }
//自定義控件類默認執行的方法
protected override void Execute(NativeActivityContext context)
{
//從上下文獲取輸入參數,計算後得到輸出參數,傳入到上下文中
int getInput1 = input1.Get(context);
int getInput2 = input2.Get(context);
context.SetValue(output, getInput1 + getInput2);
}
}
class Program
{
static void Main(string[] args)
{
//定義一個字典,傳入輸入參數
IDictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("input1", 1);
dic.Add("input2", 2);
//定義工作流宿主
WorkflowApplication application = new WorkflowApplication(new naTiveActivityTest(),dic);
//註冊工作流結束時執行的事件
application.Completed += workflowCompleted;
//註冊工作流卸載時執行的事件
application.Unloaded += workflowOnUnloaded;
application.Run();
//主線程睡眠一秒鐘
System.Threading.Thread.Sleep(1000);
for (int i = 0; i < 5; i++)
{
Console.WriteLine("mainThread:" + i + " " + System.DateTime.Now.ToString());
//主線程睡眠一秒鐘
System.Threading.Thread.Sleep(1000);
}
Console.ReadKey();
}
//定義流程完成時執行的事件
public static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("workflowCompleted:" + i + " " + System.DateTime.Now.ToString());
//當前線程睡眠一秒鐘
System.Threading.Thread.Sleep(1000);
}
}
//定義流程卸載時執行的事件
public static void workflowOnUnloaded(WorkflowApplicationEventArgs e)
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("workflowUnLoaded:" + i +" " + System.DateTime.Now.ToString());
//當前線程睡眠一秒鐘
System.Threading.Thread.Sleep(1000);
}
}
}
3 運行結果
4 代碼說明
首先,定義一個自定義控件類,類中有兩個輸入參數,輸入參數相加得到輸出參數;然後在主程序中定義兩個事件,分別是流程完成時和流程卸載時執行的事件,每個事件分別輸出一句話和當前時間,並且在循環中睡眠當前線程一秒鐘;主程序中定義一個工作流宿主,註冊剛纔定義的兩個事件,創建並啓動工作流,主程序中也使用循環打印一句話和當前時間,並且睡眠當前線程一秒鐘。
下圖爲流程執行順序圖解:
5 運行結果分析
我們的程序功能就是,創建並且啓動工作流,最後卸載工作流,在整個過程中,通過控制檯輸出時間;可以看到控制檯輸出數據分爲三部分,分別是工作流完成、主線程和工作流卸載,因爲工作流的事件有執行順序,所以工作流完成時的事件和主線程並行執行,因爲設置了線程睡眠事件,所以他們可以交替執行,最後執行工作流卸載事件。