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

眼下的认识:

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. Mac下Python和Pycharm之virtualenv

    一.python如何配置virtualenv   1.安装virtualenv pip3 install virtualenvpip install -i https://pypi.tuna.tsin ...

  2. sso简单原理及实现

    转自:http://www.cnblogs.com/ywlaker/ 一.单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态 ...

  3. Python基础之(判断,循环,列表,字典)

    一.python介绍 Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在 ...

  4. HDU 3341 Lost's revenge

    Lost's revenge Time Limit: 5000ms Memory Limit: 65535KB This problem will be judged on HDU. Original ...

  5. Azure Storage Blob文件重命名

    Azure Storage的SDK并没有提供文件重命名的方法,而且从StorageExplorer管理工具里操作修改文件名的时候也有明确提示: 是通过复制当前文件并命名为新文件名再删除旧文件,不保存快 ...

  6. hadoop2.7.0分布式系统搭建(ubuntu14.04)

    因为使用需要,在自己小本上建了四个虚拟机,打算搭建一个1+3的hadoop分布式系统. 环境:hadoop2.7.0+ubuntu14.04 (64位) 首先分别为搭建好的虚拟机的各主机重命名 方法: ...

  7. [BZOJ1583] [Usaco2009 Mar]Moon Mooing 哞哞叫(队列)

    传送门 思想有点像蚯蚓那个题 #include <cstdio> #define N 4000001 #define LL long long #define min(x, y) ((x) ...

  8. BZOJ3926 [Zjoi2015]诸神眷顾的幻想乡 【广义后缀自动机】

    题目 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴 ...

  9. 刷题总结——shortest(ssoi)

    题目: 题目背景 SOURCE:NOIP2015-SHY-3 题目描述 给定一张 n 个点的有向带权完全图,和一个数组 a[] ,请按顺序删除数组中的点,请求出在删除点 a[i] 以前,所有未删除点对 ...

  10. “a++” 与 “++a” 的区别

    很久不写 C++ 程序,今天测试一段代码的过程中,发现自己连最基础的 C++ 知识都忘了,汗!!! a++ 与 ++a 都是表达式,他们都有值.其中: 1)a++ 的值是 a 的原始值,这个表达式的功 ...