您的位置:首页 > 其它

探索工作流(六)--多线程

2016-02-01 20:11 344 查看
上篇播客中介绍了WorkflowApplication对象创建工作流和此对象的生命周期,本文继续介绍有关WorkflowApplication对象的内容--多线程和持久化。

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 运行结果分析

我们的程序功能就是,创建并且启动工作流,最后卸载工作流,在整个过程中,通过控制台输出时间;可以看到控制台输出数据分为三部分,分别是工作流完成、主线程和工作流卸载,因为工作流的事件有执行顺序,所以工作流完成时的事件和主线程并行执行,因为设置了线程睡眠事件,所以他们可以交替执行,最后执行工作流卸载事件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: