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("流程结束"); }
结果:
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>
结果:
多线程的另一方面理解:
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(); }
辅线程(工作流流程线程还是以上的代码)
结果是:
0 0
- WF4.0与多线程
- WF4.0 基础篇 (十四) Delay 与WF4中的线程
- WF4.0与WF3.X区别
- [WF4.0 实战] WF4.0 Receive && Send
- WF4.0 基础篇 (四) 顺序容器Sequence 与CodeActivity
- WF4.0 基础篇 (四) 顺序容器Sequence 与CodeActivity
- WF4.0 基础篇 (二十五) ActivityAction 与 InvokeAction
- WF4.0 基础篇 (二十五)(补充) ActivityFunc 与 InvokeFunc
- WF4.0 学习系列
- WF4.0_1
- WF4.0_2
- WF4.0_3
- WF4.0_4
- WF4.0和BookMark
- WF4.0持久化
- wf4
- [WF4.0 实战] WF4.0申请审批实例
- WF4.0(2)----设计工作流
- 160cracked-2
- 斯坦福机器学习课程笔记week6-机器学习算法的应用技巧
- 写CUDA必备sublime text插件:CUDA Snippets
- 1.3 linux系统安装tomcat
- Java基础-Map容器的并发访问控制
- WF4.0与多线程
- hdu acm 1532 Drainage Ditches
- Android杂谈之获取sdcard信息
- 从头认识Spring-2.4 基于java的标准注解装配-@Inject(3)-通过构造器方法注入
- JDBC简单实用总结
- 六种常用的设计模式java实现(一)工厂模式
- hdu 1029 Ignatius and the Princess IV
- 方块填数
- 结构体内部的偏移