看到题目或许非常多人都会疑问,为什么要使用事件监听呢?

眼下的认识:

1,使用事件监听能够将工作流的结点返回值返回到client

2,能够实现等待与重新启动,相当于之前的WaitActivity创建BookMark的方式

至于使用WorkflowInvoker或者WorkflowApplication这两种方式临时还没能实现工作流的节点值返回到client。可是对于等待流是能够实现的!

当然要注意的是。假设须要进行事件的监听。则不能使用WorkflowInvoker或者WorkflowApplication来启动流程,而是须要通过WorkflowServiceHost来启动监听(并且这里有个根本差别,WorkflowServiceHost仅仅是启动监听,并不马上创建Workflow的实例)

详细实现:

WF:

拖放一个Receive到PickBranch的Trigger里面(我们设置了这个Receive的ServiceContractName。和OperationName。能够随便取名。没有太多限制。这里事实上是使用了WCF的技术。)

我们能够选择Receive这个Activity,然后在右键菜单中找到Create
SendReply,然后找到合适的位置粘贴就可以。能够生成对应的SendReplyTo,与Receive自己主动关联

那么,我们究竟要发送什么数据给用户呢?能够点击Activity上面的Content这个地方

WCF

新建一个“控制台应用程序”(Host),加入对应的引用

宿主程序(通过代码的方式启动工作流服务)即将工作流作为一种服务公布出去:

namespace Host
{
class Program
{
static void Main(string[] args)
{
var host = new WorkflowServiceHost(
new DocumentReviewLib.DocumentReviewWorkflow(),
new Uri("http://localhost:8080/DRS")); host.AddDefaultEndpoints();
host.Description.Behaviors.Add(
new ServiceMetadataBehavior() { HttpGetEnabled = true }); host.AddServiceEndpoint(
"IMetadataExchange",
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex"); host.Open();
Console.WriteLine("Server is ready.");
Console.Read(); }
}
}

点击F5就可以启动服务,在浏览器中能够查看服务

那么将这部做完以后我们client是如何调用我们封装的这么一个工作流的服务呢

我们希望client调用这个工作流的服务呢是一个很松的耦合,那么我们能够用一个很easy的办法,去生成呢对这个服务的一个代理,通过这个代理类来进行调用

生成他的代理类

依据上面页面的提示,我们能够产生一个服务代理类。

注意。要使用Visual Studio Command Prompt。而不是默认的cmd

查看生成的代理类:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVqaW5neXVhbjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

当中生成的对应方法为:

 public System.Nullable<int> CreateTicket()
{
CreateTicketRequest inValue = new CreateTicketRequest();
CreateTicketResponse retVal = ((IDocumentReview)(this)).CreateTicket(inValue);
return retVal.@int;
}

WindowsForms:

我们接下来要设计一个Windows Forms的client程序。来使用该服务,发起流程的操作

将刚才工具所生成的两个文件加入到当前项目,而且将output.config改动为app.config

假设client为winform或为wpf那么我们会将这个output改成app.config

怎样client为webform,我们改名为web.config

client调用

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVqaW5neXVhbjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

相应的代码:

 public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void btCreate_Click(object sender, EventArgs e)
{
var proxy = new DocumentReviewClient();
var result = proxy.CreateTicket(); lstTickets.Items.Add(result);
}
}

执行结果:

附上整个应用程序说明:

以上的演示样例是通过WCF实现的事件驱动方式,使用这样的方式有几种优势:

1:client调用这个工作流的服务是一个很松的耦合(代理)

2:能够实现工作流结点往client返回值

3:也是启动工作流的还有一种方式

总结:

对于学习来说,我们大家都是从不懂到理解更加深刻,或许到如今我们对工作流的理解还存在偏差,还有好多疑问,可是随着学习的不断深入。理解也在不断深入,记得刚開始看关于工作流中的事件驱动时的不理解。但随着不断的学习,我们自己也在不断解决自己的疑问,相信这就是学习的过程!

[WF4.0 实战] 事件驱动应用的更多相关文章

  1. 【转】WF4.0实战系列索引

    转自:http://www.cnblogs.com/zhuqil/archive/2010/07/05/wf4-in-action-index.html 此系列的工作流文件案例比较多点,实用性好. W ...

  2. [WF4.0 实战] WPF + WCF + WF 打造Hello World(基础篇)

    本篇博客是一个基础的演示样例,也就是一个新手教程吧!让大家熟悉一下WPF + WCF + WF三者的关系!这仅仅是一个基础篇,下篇会继续深入,作为这段时间研究工作流的一个小小总结! 三者关系: WPF ...

  3. [WF4.0 实战] AutoResetEvent具体解释(线程独占訪问资源)

    由来: 在学习工作流的过程中,宿主程序中会出现这么一段代码: staticAutoResetEvent instanceUnloaded = new AutoResetEvent(false); 然后 ...

  4. 基于WF4.0的公文管理系统

    系统功能说明 公文管理 通过定义公文的基本信息,并将它按照工作流的定义流转实现公文的管理.包含以下功能: )公文创建:用户能够将格式化文本作为公文上传到系统中,并选择工作流启动流程. )公文审批:具有 ...

  5. WF4.0 基础篇 (十八) Flowchar

    本节主要介绍WF4 中 Flowchart的使用 本文例子下载: http://files.cnblogs.com/foundation/FlowcharSample.rar 本文例子说明 Flowc ...

  6. 【转】WF4.0 (基础篇)

    转自:http://www.cnblogs.com/foundation/category/215023.html 作者:WXWinter  ——  兰竹菊梅★春夏秋冬☆ —— wxwinter@16 ...

  7. WF4.0 基础篇 (一)开始使用WF

    来源:https://www.cnblogs.com/caosenianhuan/p/WF.html 最近公司要重新上线一套新的CRM系统,要重整老系统里的业务流模块,团队讨论已微软的workflow ...

  8. WF4.0(3)----变量与参数

    已经写了两篇关于WF4.0的博客,算是基础博客,如果是WF比较熟悉就直接跳过吧,如果你对工作流不是很熟悉,或者想了解一下基础的东西,本文还是比较适合你的.工作流中变量,参数,表达式属于数据模型中概念, ...

  9. WF4.0(2)----设计工作流

    自从做了程序员,发现自己长胖了,而且自己的身体抵抗力也出了问题,最近身体不适,公司工作任务最近也很赶,上次写了WF4.0的简介,这次就工作中工作流设计的几种方式稍微总结一下.设计工作流包括四种方式:流 ...

随机推荐

  1. visual studio 的生成、重新生成、清理功能的说明

    生成 生成当前选中的项目,依赖的项目如果已经生成dll,则不生成,直接拷贝过来 重新生成 生成当前选中的项目,依赖的项目也会生成 清理 清除掉生成的dll和相关文件

  2. 1,python初识

    什么是变量? 变量:将程序的中间结果暂时存储起来,以便后续程序调用. 什么是字符串类型? python中被引号引起来的数据就是字符串.字符串类型,也简称str类型. 在python中 int是什么? ...

  3. asp.net下js调用session

    大致方法为:js调用webservise,然后通过webservise将session值返回给js完成调用 其实最主要的一点就是在webmethod中允许session:[WebMethod(Enab ...

  4. vim 第三章 插入模式

    vim 第三章  插入模式 在普通模式下可以删除  复制   及粘贴的命令    在插入模式下也存在以中方便快捷的方式    能够粘贴寄存器中文本   两种方式来插入键盘上不存在的非常用字符 替换模式 ...

  5. Leetcode 400.第n个数

    第n个数 在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字. 为整形范围内 ( n < 231). 示例 1: 输入: 3 输出 ...

  6. Oracle 查看 使用 UNDO 段的事务脚本

    查看oracle undo segment段的信息: SELECT T1.USN, T2.NAME, T1.STATUS, T1.LATCH, T1.EXTENTS, T1.WRAPS, T1.EXT ...

  7. HackerRank# Stock Maximize

    原题地址 不知道为什么要用动态规划做,明明是扫几遍就行了啊 HackerRank上的题目特别喜欢long long类型啊,不用就爆.. 代码: #include <cmath> #incl ...

  8. bzoj1065【Noi2008】奥运物流

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1065 给一棵基环树,每个点i的权值=ci+k*∑son[i],修改至多m个点的父亲使1号点权值 ...

  9. P1373 小a和uim之大逃离 (动态规划)

    题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...

  10. 【扩展kmp+最小循环节】HDU 4333 Revolving Digits

    http://acm.hdu.edu.cn/showproblem.php?pid=4333 [题意] 给定一个数字<=10^100000,每次将该数的第一位放到放到最后一位,求所有组成的不同的 ...