探索工作流(六)--多线程
2016-02-01 20:11
344 查看
上篇播客中介绍了WorkflowApplication对象创建工作流和此对象的生命周期,本文继续介绍有关WorkflowApplication对象的内容--多线程和持久化。
1 为什么使用多线程
我们知道,WorkflowInvoker对象不支持多线程,当前任务和工作流流程共用一个线程,这样就造成了一种现象,我们在同一时间只能执行一件事,当前的业务和工作流的创建运行不能同时进行,降低了程序的执行效率,并且用户体验也不好;鉴于此,WF提供了WorkflowApplication对象以支持多线程,这样,我们的业务程序和工作流操作可以同时进行了,提高了程序执行效率,用户体验较好。
2 代码实现
3 运行结果
![](http://img.blog.csdn.net/20160201192358670?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
4 代码说明
首先,定义一个自定义控件类,类中有两个输入参数,输入参数相加得到输出参数;然后在主程序中定义两个事件,分别是流程完成时和流程卸载时执行的事件,每个事件分别输出一句话和当前时间,并且在循环中睡眠当前线程一秒钟;主程序中定义一个工作流宿主,注册刚才定义的两个事件,创建并启动工作流,主程序中也使用循环打印一句话和当前时间,并且睡眠当前线程一秒钟。
下图为流程执行顺序图解:
![](http://img.blog.csdn.net/20160201201009372?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
5 运行结果分析
我们的程序功能就是,创建并且启动工作流,最后卸载工作流,在整个过程中,通过控制台输出时间;可以看到控制台输出数据分为三部分,分别是工作流完成、主线程和工作流卸载,因为工作流的事件有执行顺序,所以工作流完成时的事件和主线程并行执行,因为设置了线程睡眠事件,所以他们可以交替执行,最后执行工作流卸载事件。
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 运行结果分析
我们的程序功能就是,创建并且启动工作流,最后卸载工作流,在整个过程中,通过控制台输出时间;可以看到控制台输出数据分为三部分,分别是工作流完成、主线程和工作流卸载,因为工作流的事件有执行顺序,所以工作流完成时的事件和主线程并行执行,因为设置了线程睡眠事件,所以他们可以交替执行,最后执行工作流卸载事件。
相关文章推荐
- postgresql中的冻结
- 《JavaScript DOM编程艺术》学习
- Get ADUser Properties
- 在计算机中安装深度操作系统
- 编程之美 - 安排见面会问题
- 信号与槽(可以与第三方库混用,首次见到QObject::destroyed的使用)
- C++的ofstream与ifstream使用
- Shell脚本小记
- 二维码的生成
- C++ 用于大型程序的工具
- 位图排序示例
- Android属性动画(一)之基本用法
- python 递归和装饰器
- String比较相等的问题探索
- 记录数据库操作到文本
- Redis工作系列之一 与 Memcached对比理解
- iOS深度学习 - Runtime
- Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)
- Java中对象调用机制
- Javascript学习笔记6——BOM