WF4.0与多线程
2016-02-15 22:07
253 查看
在WF4.0中,可以使用WorkflowApplication与WorkflowInvoker创建并启动实例.
但两者在宿主中的线程方式是不一样的
使用WorkflowInvoker启动工作流时,工作流将附加到宿主的线程中执行
使用WorkflowApplication启动工作流,工作流实例将在宿主线程之外的另一个线程中运行,使用的是线程池方式
现在用实例证明:
工作流流程代码:
WorkflowInvoker启动流程代码:
结果:
WorkflowApplication 启动流程代码:
结果:
多线程的另一方面理解:
Main函数和工作流流程是两个线程,Main函数是主线程,工作流流程是辅线程。
现在有一种情况是,在主线程的运行期间想要运行工作流程序,针对这种情况运用的是线程阻塞,工作流运行完后,再恢复线程。代码如下:
主线程:
辅线程(工作流流程线程还是以上的代码)
结果是:
但两者在宿主中的线程方式是不一样的
使用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(); }
辅线程(工作流流程线程还是以上的代码)
结果是:
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#控制台下测试多线程的方法
- 21天学习android开发教程之SurfaceView与多线程的混搭
- Ruby 多线程的潜力和弱点分析
- C#中WPF使用多线程调用窗体组件的方法
- C#如何对多线程、多任务管理(demo)
- C#实现多线程的Web代理服务器实例
- c#实现多线程局域网聊天系统