当前位置: 首页 > news >正文

《WF编程》系列之9 - 编译工作流:使用WFC.EXE

2.3.2 编译工作流

Windows Worfklow提供两种工作流编译方式,通过WorkflowCompiler类(位于System.Workflow.ComponentModel.Compiler名称空间)来编译,或者使用一个命令行编译工具(其实还是通过WorkflowCompiler类实现编译的).

工作流编译器在将工作流定义转换为类型时要遵循一定的步骤.首先是验证工作流定义中的每个活动.我们知道,活动可以定义自己的验证逻辑,举例来说,如果CodeActivity的ExecuteCode事件没有指定的话,它将抛出一个验证失败的错误.验证通过之后.编译器会在一个临时目录中生成源代码(默认语言是C#).最后将生成的源代码编译为一个程序集(就像普通的C#或Visual Basic.NET代码被编译一样).

2.3.2.1 用Wfc.exe编译

WF的命令行编译器叫做wfc.exe.用它来编译工作流,我们需要传递一些参数给它.第一个参数是XOML文件的名称,假设我们的XAML叫做pureXAML.xoml.然后使用-out指令来传递编译后程序集的名称.如果有一些自定义活动是在另外的程序集中定义的,我们需要使用-r指令来引用这些程序集.例如引用一个叫做chapter2_Host.exe的可执行程序集来编译工作流:

wfc.exe purexaml.xoml –r:chapter2_host.exe –out:purexaml.dll

o_2_4_compiler.png

WOW!(不是Vista的广告,也不是某图形处理软件书系的书名,更加不是某网游,仅表示欢呼^O^)

现在我们得到了一个可以在宿主应用程序中使用的程序集.我们可以在宿主应用程序中通过调用Type.GetType并传递assembly-qualified类型名称来动态的加载这个程序集.assembly-qualiied类型名称中包含类型的名称和类型所在的程序集的名称.我们通过x:Class特性指定工作流类型的名称MyWorkflow,在编译的时候又指定了程序集的名称purexaml,所以assembly‑qualiied名称是MyWorkflow,purexaml.下面的代码示范加载程序集并执行工作流:

 

using  (WorkflowRuntime runtime  =   new  WorkflowRuntime())

using  (AutoResetEvent waitHandle  =   new  AutoResetEvent( false ))

{

    runtime.WorkflowCompleted 
+=   delegate  { waitHandle.Set(); };

    runtime.WorkflowTerminated 
+=   delegate  { waitHandle.Set(); };

    Type workflowType 
=  Type.GetType( " MyWorkflow, purexaml " );

    WorkflowInstance instance 
=  runtime.CreateWorkflow(workflowType);

    instance.Start();

    waitHandle.WaitOne();

}

前边提到过,工作流是在CLR线程池中的一个线程上异步执行的,所以我们需要等待AutoResetEvent事件的信号来工完成作流. 

线程池为异步操作管理后台线程.创建线程是相当”昂贵”的操作,但是通过重复使用线程的方法,线程池可以在应用程序的生命周期内为这笔开销”分期付款”.当一个操作想要在后台线程上工作时,Runtime从池中分配一个线程给它;当操作完成后,Runtime又将线程还给线程池等待再次分配.

相关文章:

  • 【TPShop】首页商品楼层
  • 迅雷最新版本存在严重的远程拒绝服务漏洞(0day)
  • cas配置不通过登陆校验的页面
  • [VJ]输出m/n,若是循环体只输出第一节
  • 删除顽固文件十二招
  • 如何将SLIC集成到ESXi中
  • MSSQL2005注入攻击(测试兰州电信)
  • bootstrap-table 的必备参数
  • 我与东方
  • 【洛谷2522】[HAOI2011] Problem b(莫比乌斯反演)
  • WinForm控件开发总结(十二)-----让控件处理导航键
  • python小知识点复习
  • 十年编程经验凝结 与新人们分享
  • morphia(6-1)-查询
  • 关于设备管理器中光驱驱动损坏的解决方法
  • exports和module.exports
  • MySQL用户中的%到底包不包括localhost?
  • spring + angular 实现导出excel
  • supervisor 永不挂掉的进程 安装以及使用
  • 给新手的新浪微博 SDK 集成教程【一】
  • 构建二叉树进行数值数组的去重及优化
  • 回流、重绘及其优化
  • 基于HAProxy的高性能缓存服务器nuster
  • 用jquery写贪吃蛇
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 最简单的无缝轮播
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 整理一些计算机基础知识!
  • #{}和${}的区别?
  • (¥1011)-(一千零一拾一元整)输出
  • (1)常见O(n^2)排序算法解析
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net FrameWork总结
  • .net refrector
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net6 Api Swagger配置
  • .NET成年了,然后呢?
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • ??javascript里的变量问题
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [C#]DataTable常用操作总结【转】
  • [C++基础]-入门知识
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [Golang]K-V存储引擎的学习 从零实现 (RoseDB mini版本)
  • [GYCTF2020]Ez_Express
  • [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入HBASE
  • [hdu 1247]Hat’s Words [Trie 图]