WF4.0与多线程

来源:互联网 发布:四维星瓷砖软件下载 编辑:程序博客网 时间:2024/05/02 06:14

在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("流程结束");        }

结果:


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>

结果:


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();        }  

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

结果是:

主辅线程.jpg

0 0
原创粉丝点击