




免费预览已结束,剩余35页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
窗体顶端工作流编程循序渐进工作流编程循序渐进(1:代码活动与时间延迟活动),创建控制台顺序工作流示例程序框架,请遵循如下步骤创建一个控制台顺序工作流示例程序:1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为CodeAndDelay的控制台顺序工作流示例程序,见下图。2.之后,系统自动打开工作流设计器界面,如图所示。3. 从工具箱中依次拖动Code,Delay,Code三个活动到图中右侧的汉字提示处,得到如图所示的情形。此时,图中的三个活动相关参数都没有经过设置,下面将设置有关参数。为活动创建事件或属性 4.对于Code活动来说,它相当于普通程序流程图中的一段代码模块。因此,我们可以进入到此活动的ExecuteCode事件中输入相应代码即可。为此,只要双击图中的图标”codeActivity1“,系统控制转到文件Workflow1.cs中此活动的ExecuteCode事件代码处:UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-23查看详细资料namespaceCodeAndDelay publicsealedpartialclassWorkflow1:SequentialWorkflowActivitypublicWorkflow1()InitializeComponent(); privatevoidcodeActivity1_ExecuteCode(objectsender,EventArgse)/.等待输入你的定制代码创建如下简单代码: privatevoidcodeActivity1_ExecuteCode(objectsender,EventArgse) Console.WriteLine(n这里是活动一的执行代码,当前时间为0。,DateTime.Now);5. 对于活动codeActivity2,也按上述过程操作,并创建类似于下面的代码:privatevoidcodeActivity2_ExecuteCode(objectsender,EventArgse) Console.WriteLine(n这里是活动二的执行代码,当前时间为0。,DateTime.Now);6. 切换到工作流设计器界面,然后单击选择延迟活动图标。在属性窗口中设置属性TimeoutDuration的值为00:00:05(”时:分:秒“格式)。因为延迟活动仅仅实现一段时间延迟功能,所以,这个活动是非常容易理解的。至此,完成了整个工作流部分的设计工作。非常直观简单!最后,别忘记把上面文件保存一下。UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-23查看详细资料最后,我们来看一下控制台主程序是如何创建工作流实例,并启动工作流执行的。切换到控制台主程序Program.cs。此时,系统已经为我们自动生成了如下代码:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Workflow.Runtime;usingSystem.Workflow.Runtime.Hosting;namespaceCodeAndDelayclassProgramstaticvoidMain(stringargs)/.经常在此添加一些初始化代码/创建工作流实例,并启动工作流执行。注意:工作流是以异步的*的工作线程方式执行的using(WorkflowRuntimeworkflowRuntime=newWorkflowRuntime()AutoResetEventwaitHandle=newAutoResetEvent(false); workflowRuntime.WorkflowCompleted+=delegate(objectsender,WorkflowCompletedEventArgse)waitHandle.Set(); workflowRuntime.WorkflowTerminated+=delegate(objectsender,WorkflowTerminatedEventArgse) Console.WriteLine(e.Exception.Message);waitHandle.Set();WorkflowInstanceinstance=workflowRuntime.CreateWorkflow(typeof(CodeAndDelay.Workflow1);instance.Start();waitHandle.WaitOne();/.在此经常执行一些工作流执行后的善后工作注意:有关上面代码中AutoResetEvent事件等的详细讨论将在后续文章中介绍。观察运行结果 按F5运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。完全合乎意料的结果,一切尽在不言中!备注(FROM MSDN) DelayActivity活动有一个InitializeTimeoutDuration事件,它发生在在超时持续时间开始之前发生。对于此事件,微软的建议是:不应使用此事件来设置 DelayActivity 的TimeoutDuration。而应在工作流的InitializeComponent 方法中设置超时持续时间。 工作流编程循序渐进(2:IfElseActivity活动)一、引言本文中,我们来学习另一个简单活动IfElseActivity。关于此活动,首先需要说明一下:借助于IfElseActivity活动,你可以创建工作流中的分支结构,每一个分支对应于一个IfElseBranehActivity分支。IfElseActivitv活动可以有条件地选择执行多个IfElseBranchActivity分支中的一个。也就是说,对每个IfElseBranchActivity活动的执行,都必须被一个条件所激发。 对于IfElseBranchActivity活动的执行条件,如果该条件的计算结果为True,则会执行该IfElseBranchActivity活动中所包含的其他活动;如果计算结果为False,则会对下一个IfElseBranehActivity条件进行计算,依此类推。IfElseActivity活动的最后一个IfElseBranchActivity活动分支,会被视为Else分支,该分支不需要任何条件来进行激发。可通过IfElseBranchActivity活动的Condition属性,来为该活动设置条件,共有“代码条件“和“声明性规则条件”两个选项。 你可以使用条件来控制工作流的行为。工作流引擎会判断条件,并依据判断的结果来决定之后的行为。在工作流中有两种表达条件的方式:你可以编写一个处理方法并返回一个布尔值。你可以在工作流中定义一个规则。你可以在工作流的运行期间动态更新条件规则,来改变工作流的行为。你也可以通过创建一个策略类型的活动,来使用条件行为。条件规则只能是工作流类中定义任何公共成员变量或者方法。而条件代码可以是任何公共或私有的成员。下面,我们来构建一个简单的示例。二、创建控制台顺序工作流示例程序框架 请遵循如下步骤创建一个控制台顺序工作流示例程序: 1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为IfElseActivity的控制台顺序工作流示例程序,见下图。2.之后,系统自动打开工作流设计器界面,如图所示。3. 从工具箱中拖动IfElse活动到图中右侧的汉字提示处,得到如图所示的情形。4. 显然,IfElse活动默认情况下添加了两个分支,这是最为常用和最简单的情形。其实,你还可以添加另外的更多的分支,以模拟类似于高级语言中的多分支语句switch情形。方法是右单击IfElse活动并选择“添加分支”即可。UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-235. 经过上面的操作后,你得到如下图所示的工作流:提示:你可以在单击某个IfElseBranch活动后,通过选择属性窗口中的“左移”及“右移”选项调整此活动在图中的位置。6.根据前面文章中介绍的几种简单活动,我们不妨再添加几个活动,得到如下图所示形式:我们的设想很简单:出现一个提示让用户选择自己的角色,根据角色的不同,执行不同的简单活动。之后,通过一个Delay活动延迟3秒钟,按任意键然后结束。下面,我们来讨论活动有关属性设置及编码问题。UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-23 三、活动有关属性设置及编码 1.单击最左边的IfElseBranch活动,在对应的属性对话框中指定Condition为“代码条件”,输入条件方法名为Condition1,如图所示:然后,按下回车键,系统即自动跳转到此方法代码编辑处,输入如下内容:privatevoidCondition1(objectsender,ConditionalEventArgse)if(rolename.ToUpper()=A)e.Result=true;elsee.Result=false;类似地,设置中间IfElseBranch活动的触发条件也为代码条件,输入条件方法名为Condition2,相关代码为:privatevoidCondition2(objectsender,ConditionalEventArgse)if(rolename.ToUpper()=C)e.Result=true;elsee.Result=false;因为我们的例子中仅有三个条件,所以,前两种情况不满足时,便执行最后一个活动。因此,不必为之指定触发条件方法。2.现在,依次设置上面图中从左向右三个子条件中Code活动的ExecuteCode方法代码如下: privatevoidadmin_ExecuteCode(objectsender,EventArgse)Console.WriteLine(您好,管理员!);privatevoidcodeActivity3_ExecuteCode(objectsender,EventArgse)Console.WriteLine(您好,客户!);privatevoidpassenger_ExecuteCode(objectsender,EventArgse)Console.WriteLine(您好,过客!);3. 设置codeActivity1活动的ExecuteCode方法代码如下:privatevoidcodeActivity1_ExecuteCode(objectsender,EventArgse)Console.WriteLine(请选择您的角色:(C-普通客户;A-系统管理员;P-过客);rolename=Console.ReadLine();4. 设置最后面那个codeActivity2活动的ExecuteCode方法代码如下:privatevoidcodeActivity2_ExecuteCode(objectsender,EventArgse)Console.Read();5. 另外,设置Delay活动延迟3秒钟非常简单,不赘述。至此,完成了整个工作流部分的设计工作。非常直观简单!最后,别忘记把上面文件保存一下。最后,我们来看一下控制台主程序是如何创建工作流实例,并启动工作流执行的。切换到控制台主程序Program.cs。此时,系统已经为我们自动生成了如下代码:UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-23 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Workflow.Runtime;usingSystem.Workflow.Runtime.Hosting;namespaceCodeAndDelayclassProgramstaticvoidMain(stringargs)/.经常在此添加一些初始化代码/创建工作流实例,并启动工作流执行。注意:工作流是以异步的*的工作线程方式执行的using(WorkflowRuntimeworkflowRuntime=newWorkflowRuntime()AutoResetEventwaitHandle=newAutoResetEvent(false); workflowRuntime.WorkflowCompleted+=delegate(objectsender, WorkflowCompletedEventArgse)waitHandle.Set(); workflowRuntime.WorkflowTerminated+=delegate(objectsender,WorkflowTerminatedEventArgse)Console.WriteLine(e.Exception.Message);waitHandle.Set();WorkflowInstanceinstance=workflowRuntime.CreateWorkflow(typeof(CodeAndDelay.Workflow1);instance.Start();waitHandle.WaitOne();/.在此经常执行一些工作流执行后的善后工作注意:有关上面代码中AutoResetEvent事件等的详细讨论将在后续文章中介绍。四、运行实例 按F5运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。第一个界面:接下字母a,并按下回车键,得到下图:无他复杂设计,不再赘述。五、小结 在本文中我们学习了IfElseActivity活动的使用过程,在下一篇中将学习另外几个基本活动While活动,ConditionalActivityGroup活动,Replicator活动等待。 工作流编程循序渐进(3:While活动)一、引言本文中,我们来学习另一个简单活动While活动。While活动将会持续循环的执行,直至指定判断为假。下面,我们来构建一个简单的示例。本示例的目的是,想主要使用While活动实现显示一个九九乘法表。二、创建控制台顺序工作流示例程序框架请遵循如下步骤创建一个控制台顺序工作流示例程序:1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为WhileActivity的控制台顺序工作流示例程序。2.之后,系统自动打开工作流设计器界面。3. 从工具箱中拖动While活动到图中右侧的汉字提示处,得到如图所示的情形。4.因为是在控制台中显示一个九九乘法表,所以,一定要使用一个二重循环来实现这一目的。也就是说,我们要使用一个嵌套的While活动。另一方面,我们知道:外层循环与内层循环变量是存在联系的,即在每一次内循环执行完成后,要重新进行某种初始化操作。因此,直接在一个While活动中嵌入一个While活动是无法实现既定功能的。但是,还是有解决办法的,我们可以在While活动中嵌入一个复合活动,即一个允许其中继续包含(可能有多个)子活动的活动,例如并行执行活动(Parallel),串行执行活动(Sequence),等等。5. 为此,我们最终得到如下的工作流图:UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-23对于打印一个乘法九九表来说,通常我们可以使用如下一个函数实现:static void MultiplyTable() int i = 1; int j = 1; for (i = 1; i = 9; i+) for (j = 1; j = i; j+) if (i = j) Console.Write(0 * 1=2 , i, j, i * j); Console.WriteLine(); else Console.Write(0 * 1=2 , i, j, i * j); 于是,我们会得到如下图所示的打印效果:下面,我们也想通过工作流操作实现上图打印效果。现在来讨论活动有关属性设置及编码问题。三、活动有关属性设置及编码1. 在本例中,我们要使用规则条件表达内外层循环的规则条件。为此,先要定义两个循环变量(以工作流Workflow1)的私有字段的形式存在,如下: /创建两个控制内外层循环的变量 private int i = 0; private int j = 1;UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-232.单击外、内层两个循环活动whileActivity1和whileActivity2,分别使用属性窗口设置循环的规则条件。以外层循环为例,首先需要选择Condition为“声明性规则条件”。然后,在下面的规则命名中输入名称c1。典型情况(推荐)下,我们单击规则名称c1右边的“.”省略号进入到规则表达式定义对话框,如图所示: 然后,你可以单击“新建”链接创建规则表达式(以后也可以使用“编辑”链接再修改之)。表达式创建窗口如下所示:注意上面的表达式后面不允许有分号“;”,否则会出现错误提示。3.同样方式创建内循环活动whileActivity2的规则条件为:this.j = this.i4. 根据前面的算法分析,我们要分别创建内外循环活动的 private void codeActivity1_ExecuteCode(object sender, EventArgs e) j = 1; i+; private void codeActivity2_ExecuteCode(object sender, EventArgs e) if (i = j) Console.Write(0 * 1=2 , i, j, i * j); Console.WriteLine(); else Console.Write(0 * 1=2 , i, j, i * j); j+; UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-235. 下面是完整的工作流类定义代码:using System;using System.ComponentModel;using System.ComponentModel.Design;using System.Collections;using System.Drawing;using System.Linq;using System.Workflow.ComponentModel.Compiler;using System.Workflow.ComponentModel.Serialization;using System.Workflow.ComponentModel;using System.Workflow.ComponentModel.Design;using System.Workflow.Runtime;using System.Workflow.Activities;using System.Workflow.Activities.Rules;namespace WhileActiviity public sealed partial class Workflow1 : SequentialWorkflowActivity /创建两个控制内外层循环的变量 private int i = 0; private int j = 1; public Workflow1() InitializeComponent(); private void codeActivity1_ExecuteCode(object sender, EventArgs e) j = 1; i+; private void codeActivity2_ExecuteCode(object sender, EventArgs e) if (i = j) Console.Write(0 * 1=2 , i, j, i * j); Console.WriteLine(); else Console.Write(0 * 1=2 , i, j, i * j); j+; private void codeActivity3_ExecuteCode(object sender, EventArgs e) Console.Read(); 自不必赘述了吧。四、运行实例按F5运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。工作流编程循序渐进(4:InvokeWorkflowActivity活动)一、简介使用InvokeWorkflowActivity 活动可以从一个工作流中异步方式启动另一个工作流。 在已启动的工作流开始执行且工作流分支中的下一个活动执行之前,InvokeWorkflowActivity 活动即告完成。注意:* WF不支持递归工作流。如果工作流A能够启动工作流B,则工作流B既不能直接启动工作流A,也不能启动任何直接或间接调用工作流A的工作流。* InvokeWorkflowActivity活动要求工作流运行时使用当前附加到该运行时的计划程序服务创建新工作流。* 所调用的工作流将只能够接收输入参数。不支持在工作流完成之后获取输出参数,因为该活动以异步方式调用工作流。* 工作流之间的标准通信规则适用于与InvokeWorkflowActivny活动所创建的新工作流实例进行通信。使用InvokeWorkflowActivity活动的步骤如下:* 拖动一个InvokeWorkflowActivity到工作流中希望的位置处。* 设置TargetWorkflow属性为希望执行的工作流的类型(Type)。* 为TargetWorkflow设置所需要的值。当设置TargetWorkflow属性时,该活动提供了对话框允许从所有引用到的活动类型列表中导航到正确的类型,但是只有派生自Activity的类会被显示在列表中。为了引用一个新的工作流类型,必须首先添加到包含工作流的项目或程序集的引用。具体对话框请参考本文后面的图示。一旦定义了TargetWorkflow属性,工作流的参数*属性将使用定义在TargetWorkflow中的其他任何属性所更新。允许开发人员在属性窗口中为任何所需的属性设置值,可以设置静态值或者是绑定属性到当前工作流的其他属性或者是其他活动的其他属性。InvokeWorkflowActivity提供了一个Invoking事件允许开发人员使用代码处理。该事件在创建一个新的工作流之前触发,这使开发人员在开始一个新的工作流之前能够有机会完成一些设置任务。UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-23关于InvokeWorkflowActiv时的一个重要方面工作流将以异步的方式执行,因此不会等待新工作流的执行完成。因为执行过程是异步的,所以无法获取另一个工作流的输出参数。通常需要和宿主建立额外的通信机制来获取其输出。二、创建控制台顺序工作流示例程序框架说明:本文创建的InvokeWorkflowActivityDemo示例演示了如何在一个状态机工作流内部调用另外的一个工作SubWorkflow,并且定义了本地服务接口实现,使用HandleExternalEvent活动调用外部事件以等待被调用的工作流实例执行完成。该活动需要等待一个事件的触发才能够继续工作流的运行,而在Program.cs中,设置了只有当指定非宿主工作流执行完毕后,才触发事件。因此这实现了一种等待被调用工作流执行完成才继续执行的效果。重要提示:本实例的学习基于WWF中的许多新概念(不包括在以前的教程中),请结合后面的参考资料全面理解。个别难点,请不必过于担心,我会在后面的系列文章中作细致的剖析。请遵循如下步骤创建一个控制台状态机工作流示例程序:1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为InvokeWorkflowActivityDemo的控制台状态机工作流示例程序。2.之后,系统自动打开工作流设计器界面。3.从工具箱中拖动四个State活动到工作流设计器中。然后,再依次把两个StateInitialization活动分别拖动到前两个State活动中,再拖动一个EventDrivenActivity活动到第三个State活动中。最后,再使用拖动手柄的方法创建四个State活动的转换关系,得到如图所示的情形。UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-23三、添加另一个子状态机工作流 右单击示例工程,选择“添加”“State Machine Workflow.”(如下图所示),添加一个状态机工作流,命名为SubWF(见后面的图)。图片看不清楚?请点击这里查看原图(大图)。在上图子状态机设计器中仅拖入一个StateInitialization活动和一个StateFinalization活动,如下图所示。右单击第二个活动,选择“设置为已完成状态”选项,使之成为整个子工作流的最终状态。然后,双击第一个状态中的StateInitializationActivity1活动,创建如下图所示的简单活动流程。UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-23双击子活动codeActivity1,输入以下代码:privatevoidcodeActivity1_ExecuteCode(objectsender,EventArgse)Console.WriteLine(这是发自子状态机中的消息。);四、使用InvokeWorkflowActivity 活动调用子状态机工作流在宿主工作流的stateActivity1状态活动中,添加了一个InvokeWorkflowActivity(双击stateActivity1状态活动内部的stateInitializationActivity1,然后拖入一个InvokeWorkflowActivity),如下图所示。将InvokeWorkflowActivity1的TargetWorkflow指定为当前项目中前面创建的SubWF工作流,相关设置对话框如下图所示。InvokeWorkflowActivity是放置在StatelnitializationActiv时容器内部的,以便于在进入StateActivity活动时总是最先运行子工作流。五、添加HandleExternalEventActivity活动UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-23在宿主工作流的stateActivity2内部的EventDrivenActivitv内部放置拖入一个HandleExternalEventActivity。注意:HandleExternalEventActivity活动用于等待本地服务中的InvokedWorkflowComplete事件触发,并阻止当前工作流的继续执行。对于HandleExternalEventActivity活动, 必须设置它的参数InterfaceType和EventName。方法是,单击属性窗口中参数InterfaceType右边的“.”符号,弹出一个对话框如下所示:从右图选定我们事先已定义好的接口,单击“确定”按钮。然后,单击属性窗口中参数EventName右边的下拉箭头,从中选择已经在选定的接口中声明的事件(在本例中是InvokedWorkflowComplete)。六、定义在工作流实例与宿主间通信的本地服务WWF中的服务可分为核心服务和本地服务。核心服务由WF定义,而本地服务(也称为数据交换服务)则是开发人员自定义的。本地服务可以是任何想在WF中实现的服务,一个通常的用处是使用本地服务在工作流实例与宿主之间进行通信。有关于“本地服务”的全面讨论是一个复杂的话题,我想在本系列后面的学习教程中对之展开全面深入的探讨,在此不赘述。UID41437帖子1401精华1积分3017J力豆10 贡献值0 阅读权限70在线时间322 小时注册时间2007-12-17最后登录2009-10-23一定义接口根据WWF中本地服务的定义要求,首先要定义一个修饰以ExternalDataExchange属性的接口,我们对之命名为ILocalService,代码如下:ExternalDataExchangeinternalinterfaceILocalServiceeventEventHandlerInvokedWorkflowComplete;voidWorkComplete(GuidHostWFGuid);二创建本地服务类然后,基于上述接口创建一个本地服务类,代码如下:/定义一个本地服务实现,该服务将被添加到工作流运行时引擎中internalclassLocalService:ILocalServicepubliceventEventHandlerInvokedWorkflowComplete;publicvoidWorkComplete(GuidHostWFGuid)/实现接口中声明的方法if(InvokedWorkflowComplete!=null)InvokedWorkflowComplete(null,newExternalDataEventArgs(HostWFGuid);上面定义中,基本遵循了“死”格式,除了方法名称外。在本文中先不详细讨论。七、在宿主中操作工作流实例与本地服务根据前面的要求,本地服务负责工作流实例与宿主间的通信中介,而加载本地服务的工作是在宿主中完成的。下面给出了宿主部分(program.cs)完整的代码:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Workflow.Runtime;usingSystem.Workflow.Runtime.Hosting;usingSystem.Workflow.Activities;/ExternalDataExehangeServicenamespaceInvokeWorkflowActivityDemoclassProgramstaticGuidHostWFGuid;/用于记忆父工作流实例的ID标记staticLocalServicels;staticvoidMain(stringargs)using(WorkflowRuntimeworkflowRuntime=newWorkflowRuntime()/下面这几行是必需的死套路/加载本地服务ExternalDataExchangeServicedataService=newExternalDataExchangeService();workflowRuntime.AddService(dataService);/将自定义的本地通信服务加载到本地服务中ls=newLocalService();dataService.AddService(ls);/事件初始状态为终止状态(此时任何线程可以使用此事件)AutoResetEventwaitHandle=newAutoResetEvent(false);workflowRuntime.WorkflowCompleted+=delegate(objectsender,WorkflowCompletedEventArgse)/如果将要产生仅一个子工作流,那么需要检查工作流是否完成,而不是主工作流。if(e.WorkflowInstance.InstanceId!=HostWFGuid)/通过本地服务的特定方法通知主工作流,调用工作流完成ls.WorkComplete(HostWFGuid);else/此时是主工作流自身,将事件的状态位置设置为终止状态,允许一个或多个等待线程继续。waitHandle.Set();workflowRuntime.WorkflowTerminated+=delegate(objectsender,WorkflowTerminatedEventArgse)Console.WriteLine(e.Exception.Message);waitHandle.Set();/启
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 序数课件教学课件
- 《线条的艺术表现力》课件-2025-2026学年人美版初中美术九年级上册
- 巡察课件教学课件
- 输煤运行安全培训管理课件
- 输液泵的课件
- 创新型离婚财产分割与子女监护权协议范本
- 农业生产抵账协议范本
- 城市更新改造项目合同策划与社区和谐
- 旅游度假区承包经营合作协议范本
- 城市轨道交通工程:墙体拆除与地下空间开发合同
- GB/T 2930.8-2017草种子检验规程水分测定
- 勘察设计工作大纲
- GB/T 17188-1997农业灌溉设备滴灌管技术规范和试验方法
- 关于国有集团公司采购管理办法【五篇】
- 2022年资阳市雁江区社区工作者招聘考试笔试试题及答案解析
- 2.2 第2课时 基本不等式的综合应用(课件)高一数学(人教A版2019必修第一册)
- 帮助卧床老年人使用便器排便课件
- 【高考英语精品专题】必修1 Unit 1 Life Choices-高考英语-一轮总复习备考方略课件PPT(新教材北师大版)
- 中国传媒大学-新媒体概论(刘行芳)-课件
- 医学放射卫生相关法律法规ppt培训课件
- 《中国音乐发展简史》PPT课件
评论
0/150
提交评论