WF4.0与多线程

在WF4.0中,可以使用WorkflowApplication与WorkflowInvoker创建并启动实例.

但两者在宿主中的线程方式是不一样的

使用WorkflowInvoker启动工作流时,工作流将附加到宿主的线程中执行

使用WorkflowApplication启动工作流,工作流实例将在宿主线程之外的另一个线程中运行,使用的是线程池方式

现在用实例证明:

工作流流程代码:


<span style="font-size:18px;">namespace workflow
{
    public sealed class TestActivity : CodeActivity
    {
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(CodeActivityContext context)
        {
            for (int i = 1; i <= 10; i++)
            {
                System.Threading.Thread.Sleep(500);
                Console.WriteLine(i);
            }
            
        }
    }
}  
</span>


 WorkflowInvoker启动流程代码:

        
static void Main(string[] args)
        {
                 Console.WriteLine("流程开始");
            #region WorkflowInvoker调用代码
            WorkflowInvoker.Invoke(new TestActivity());
            WorkflowInvoker.Invoke(new TestActivity());
            #endregion
            Console.WriteLine("流程结束");
        }

结果:

WF4.0与多线程_第1张图片

invoker.jpg

WorkflowApplication 启动流程代码:

<span style="font-size:18px;">static void Main(string[] args)
        {
            Console.WriteLine("流程开始");
            workflow.TestActivity  activity = new TestActivity();
            
            WorkflowApplication application = new WorkflowApplication(activity);
            WorkflowApplication application1 = new WorkflowApplication(activity);
            application.Run();    //流程触发启动
            application1.Run();
            
            Console.WriteLine("流程结束");
            Console.ReadKey();
        }
    }  </span>

结果:

WF4.0与多线程_第2张图片

application.jpg

多线程的另一方面理解:

Main函数和工作流流程是两个线程,Main函数是主线程,工作流流程是辅线程。

现在有一种情况是,在主线程的运行期间想要运行工作流程序,针对这种情况运用的是线程阻塞,工作流运行完后,再恢复线程。代码如下:

主线程:

        
static void Main(string[] args)
        {
            AutoResetEvent instanceUnloaded = new AutoResetEvent(false);
            workflow.TestActivity  activity = new TestActivity();
            WorkflowApplication application = new WorkflowApplication(
                                        activity);
            #region 回调函数(工作流流程出现的一些状态后执行的方法,例如工作流空闲、卸载、终止等)
            application.Completed = (workflowApplicationCompletedEventArgs) =>
            {
                Console.WriteLine("\nWorkflowApplication has Completed in the {0} state.", workflowApplicationCompletedEventArgs.CompletionState);
            };
            application.PersistableIdle = (e) =>
            {
                return PersistableIdleAction.Unload;
            };
            application.Unloaded = (workflowApplicationEventArgs) =>
            {
                instanceUnloaded.Set();  //恢复线程
                Console.WriteLine("WorkflowApplication has Unloaded\n");
            };
            application.OnUnhandledException = (ex) =>
            {
                Console.Write("Exception");
                return UnhandledExceptionAction.Terminate;
            };
            #endregion
            application.Run();    //流程触发启动
            //线程阻塞
            Console.WriteLine("主线程线程阻塞,辅线程(工作流线程)开始运行");
            instanceUnloaded.WaitOne();
            Console.WriteLine("主线程恢复");
            Console.ReadKey();
        }  

辅线程(工作流流程线程还是以上的代码)

结果是:

主辅线程.jpgWF4.0与多线程_第3张图片

你可能感兴趣的:(多线程,WF4.0)