初识WF(Workflow Foundation)
发布日期:2021-07-29 11:13:51 浏览次数:4 分类:技术文章

本文共 15222 字,大约阅读时间需要 50 分钟。

     1.了解工作流的概念和理论
     2.把WF和BizTalk与WCF做比较
     3.开始使用WF进行编程
     4.知道怎样使用Visual Studio工作流支持     以下是一小段进行邮政编码验证的代码

string USCode = @"^(/d{5}$)|(/d{5}$/-/d{4}$)";
string CanadianCode = @"[ABCEGHJKLMNPRSTVXY]/D[A-Z]/d[A-Z]/d";
public static bool ValidatePostalCode(string str)
{
     return (Regex.IsMatch(str,USCode)||Regex.IsMatch(str,CanadianCode));
}

     这没有什么特别的:“测试一个输入的字符串,如果为美国ZIP编码或者加拿大邮政编码则返回True,否则返回False”。这是一段很实用的代码,事实上假如你不想在ASP.NET中使用其它验证控件的话,你就可在你的ASP.NET中使用这段验证逻辑。我们现在就创建一个Workflow应用程序,它将进行同样的验证,并且返回验证是否通过的信息。

     创建一个基于控制台的Workflow项目

     1.启动Visual Studio 2008

     2.创建顺序工作流控制台应用程序项目
     3.项目名称中输入PCodeFlow
     4.点击确定,将自动生成下面的初始界面

     在编辑代码或插入Workflow项前,停留片刻看看Workflow项目为你生成的两个文件:

     Program.cs:从许多方面可以看出,这是一个典型的控制台应用程序源文件。然而,这个模板增加了大量代码来支持Workflow的操作。理解这些代码是本书的一个主要目标,但本章只是简单了解一下它做了些什么。
     Workflow1.cs:这是一个Workflow组件,我们将对其进行修改以进行邮政编码的验证,第一次使用你就可以放入许多东西,但我们现在还是从使用这个简单的Workflow开始工作吧。

     创建一个工作流

     在工具箱中拖一个IfElse活动组件到workflow设计界面上。

     我们现在将使用IfElse活动组件来问下面的问题:“我们已有的一个字符串是一个合法的邮政编码吗?”。我们在代码中将确实使用先前你看到的代码段中的正则表达式来问这一问题。
     但在我们进行这一步前请仔细看看workflow的视图设计器。workflow视图设计器提醒我们没有提供相应的代码来做这一决定。假如你看看命名为“ifElseBranchActivity1”的左边分支的右上角,你将看到里面有一个惊叹号标记的小圆形图标。这是workflow视图设计器在告诉你workflow并不完整。假如你试图编译带有这种提醒图标的项目时,将会编译报错。如你把鼠标移到图标上并单击呈现出的向下箭头时,你还能看到更多关于这一错误情况的信息。

     在IfElse活动的分支上添加代码

     1.移动鼠标到命名为“ifElseBranchActivity1”的左边分支上,单击以在属性面板上激活这一分支的属性。
     2.我们添加一个条件,意思是说workflow执行到分支时将强制其执行一些动作(条件判断为True时,将执行左边分支)。为做到这些,单击“condition”属性激活条件类型属性的下拉列表。从列表中你可以选择“代码条件”类型、“(无)”类型和“声明性规则条件”类型。这里选择“代码条件”类型。
     3.上述步骤完成后,“condition”类型属性用户界面会包含一个“+”号,我们单击展开它的子属性,该子属性也命名为“condition”,单击以激活它。
     4.“condition”属性需要输入我们想添加的内部事件名字。当条件需要判断时这个事件将激发。在本例子中我们输入“EvaluatePostalCode”。
     Visual studio 2008在幕后为你在workflow源文件中添加了你在“condition”属性中所指明的事件。稍候我们将添加在事件激发时所要执行的正则表达式代码段。

     在我们做这些工作之前,让我们继续在workflow视图设计器上工作,我们刚刚增加了一个条件,它将引发工作流选择左边路径还是右边路径。但是两条路径中都没有指明工作流将进行的动作。我们在左边“ifElseBranchActivity1”分支和右边“ifElseBranchActivity2”分支中添加活动。

     添加Code活动

     1.拖一个“Code”活动到workflow视图设计器上,并放到左边分支(ifElseBranchActivity1)的区域内。
     2.就像先前添加条件判断的代码一样,我们将为该分支添加被选中时执行的代码。单击“codeActivity1”图标以在属性面板中激活它的属性。
     3.在“ExecuteCode”属性中输入“PostalCodeValid”。
     Visual Studio 2008会自动插入该事件。稍候我们会提供对应的执行代码。右边分支也同样做,只是要在“ExecuteCode”属性中输入“PostalCodeInValid”。

     在我们的workflow中添加事件处理代码

     1.打开Workflow.cs准备进行编辑
     2.添加引用:using System.Text.RegularExpression;
     3.定位到“EvaluatePostalCode”方法上,插入下面的代码:

        
private
void
EvaluatePostalCode(
object
sender, ConditionalEventArgs e)
        
{
            
string
USCode
=
@"
^(/d{5}$)|(/d{5}$/-/d{4}$)
"
;
            
string
CanadianCode
=
@"
[ABCEGHJKLMNPRSTVXY]/D[A-Z]/d[A-Z]/d
"
;              e.Result
=
(Regex.IsMatch(_code, USCode)
||
Regex.IsMatch(_code, CanadianCode));
         }

     变量e是“ConditionalEventArgs”类型的实例,它用来告知“IfElse”活动应选择哪条路径。

     4.我们也需要为workflow活动添加一种能力,以便接受输入的字符串来进行验证工作。为此我们添加下面的代码,我们将声明一个名为“PostalCode”的公有属性。

private
string
_code
=
string
.Empty;
public
string
PostalCode
     
{
         
get
         
{
             
return
_code;
          }
         
set
         
{
              _code
=
value;
          }
      }

     有了这些,我们的workflow应用程序就可以进行编译了,但程序并不完整,我们还要在Workflow1.cs文件中定位到“PostalCodeValid”方法并插入下面的代码:

     Console.Write("The postal code {0} is valid.", _code);   
     同样在“PostalCodeInValid”方法中插入下面的代码:
     Console.Write("The postal code {0} is *invalid*.", _code);

     调用工作流

     1.打开Program.cs文件。
     2.定位到:
     WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(PCodeFlow.Workflow1),wfArgs);
     3.把上述代码替换为:

Dictionary
<
string
,
object
>
wfArgs
=
new
Dictionary
<
string
,
object
>
();
wfArgs.Add(
"
PostalCode
"
, args.Length
>
0
?
args[
0
] :
""
); WorkflowInstance instance
=
workflowRuntime.CreateWorkflow(
typeof
(PCodeFlow.Workflow1),wfArgs);

     编译应用程序

     执行你的工作流应用程序

     1.打开命令提示符窗口。
     2.在命令提示符下定位到编译后所生成的应用程序目录。
     3.输入pcodeflow 12345查看执行结果。
     4.输入pcodeflow 1234x再看看执行结果。

 

 

2009-08-06 20:28

来源:

源代码下载:

大家都喜欢预读有图片文章一步步去开始学习一个新的知识,先尝试动手实践一个例子,再深入的学习他。

下面是一个Asp.Net 通过Web Service调用WF 状态机的例子。

环境:Windows Server 2008 & Visual Studio 2008 sp1

1.打开VSTS 2008 ,新建一个空白的解决方案为其命名为“WF ”再为他分别添加c#的 “Asp.Net 应用程序”和一个“Workflow 状态机工作流库”

添加后的结构和步骤如上图

2.双击Workflow1.cs,打开工作流设计视图,右键点击视图-》添加状态,为Workflow1再添加两个状态,

3.点选其中的一个状态,修改起属性为“设置为完成状态”

4 之后从工具栏中分别向状态中拖入WebServiceinput 和WebServiceOutput 控件

5 用鼠标拖一下,为状态之间添加连接。

 

 

 

6 添加接口,就只有一个方法string Validate(string),

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace WorkflowLibrary1{    interface Interface1    {        string Validate(string Name);    }}

 

7 之后分别双击击这两个控件,进入设置页面,从工具栏拖拽webServiceInputactivety1和webServiceoutputactivety1到工作流里面,

再为拖进去的控件设置属性,如果设置的不对,他会出现一个小红色的提示,点击这个提示,会告诉你那里有问题,像下面一样。

具体设置可以根据需求来添加,我的设置可以在代码中看到,很简单的设置。

8 注意:其中属性中的参数,我是通过对话框创建的,点击参数后面的小按钮,会弹出下面的对话框,选择“绑定到新成员”选项卡,创建属性。

 

 

 

9 双击这个控件,进入到工作流的CS代码编辑器,为事件添加验证代码。这里只对webServiceOutputActivity1_SendingOutput方法添加代码

private void webServiceOutputActivity1_SendingOutput(object sender, EventArgs e)        {            string Name = this.webServiceInputActivity1__Parameter_Name1;            if (Name == "冯瑞涛")            {                this.webServiceOutputActivity1__ReturnValue_1 = "成功!";            }            else            {                this.webServiceOutputActivity1__ReturnValue_1 = "失败!";            }        }

10 右键工作流项目-->作为Web 服务发布,系统会自动生成一个Web Service,

11 然后我们在asp.Net 程序中引用这个Web Service ,在Asp.Net 页面添加几个控件,编写后台C#代码,就可以调用这个状态机中的方法。

12 运行Asp.Net 项目,结果如下

第一个程序就这么简单。

 

Microsoft Windows Workflow Foundation (WWF) 是一个可扩展框架,用于在 Windows 平台上开发工作流解决方案。作为即将问世的 Microsoft WinFX 的组成部分,Windows Workflow Foundation 同时提供了 API 和一些工具,用于开发和执行基于工作流的应用程序。Windows Workflow Foundation 提供单个统一的模型,以便创建跨越多个类别应用程序的端到端解决方案,包括人力工作流和系统工作流。
Windows Workflow Foundation 是一个广泛且通用的工作流框架,并且从下到上、在每个级别都针对可扩展性进行了设计。基于 Windows Workflow Foundation 的解决方案,由得到 Microsoft .NET 代码支持且在宿主应用程序中运行的互连组件组成。就像在定制的环境中以可视方式创建 Web 页一样,您需要在可视设计器中制订特定工作流的步骤,并且添加代码隐藏工作流组件以实现规则并定义业务过程。
Windows Workflow Foundation 提供一个工作流引擎、一个 .NET 托管 API、运行库服务以及与 Microsoft Visual Studio 2005 集成的可视化设计器和调试器。可使用 Windows Workflow Foundation 来生成并执行同时跨越客户端和服务器的工作流,以及可在所有类型的 .NET 应用程序内部执行的工作流。
工作流指的是:是以活动示意图形式定义的人力或系统过程模型。活动 是工作流中的一个步骤,并且是工作流的执行、重用和创作单位。活动示意图表达规则、操作、状态以及它们的关系。Windows Workflow Foundation 工作流通过安排活动而设计,然后它编译为 .NET 程序集,且在工作流运行库和公共语言运行库 (CLR) 中执行。
2009-08-06 20:28

来源:

程序下载地址:

建立一个空的解决方案,向其中加入一个顺序工作流类库和一个Asp.Net Web 应用程序项目,结果如下图

向asp.Net 程序中,添加引用,“WF”是工作流项目,如图

向Web.Config 中加入WF的注册(细节下载代码看一下)。

 

 

添加一个全局Global.asax 文件,添加如下代码

protected void Application_Start(object sender, EventArgs e)       {                      WorkflowRuntime workflowRuntime = new WorkflowRuntime("WorkflowRuntime");           workflowRuntime.StartRuntime();           Application["WorkflowRuntime"] = workflowRuntime;       }       protected void Session_Start(object sender, EventArgs e)       {           WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;           workflowRuntime.StopRuntime();       }

向Default.aspx中添加3个控件,Textbox,button,label ,双击Button为其添加单击事件,并在default.aspx.cs 中添加如下代码

 

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Workflow.Runtime;using System.Workflow.Runtime.Hosting;using System.Workflow.ComponentModel;using System.Workflow.Activities;namespace AspNet{    public partial class _Default : System.Web.UI.Page    {        string Result = string.Empty;        protected void Page_Load(object sender, EventArgs e)        {        }        protected void Button1_Click(object sender, EventArgs e)        {            StartWorkflow();            Label1.Text = Result;        }        private void StartWorkflow()        {            WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;            ManualWorkflowSchedulerService scheduler = workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService)) as ManualWorkflowSchedulerService;            workflowRuntime.WorkflowCompleted += new EventHandler
(workflowRuntime_WorkflowCompleted); Dictionary
wfPara = new Dictionary
(); wfPara.Add("Name", TextBox1.Text); WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(WF.Workflow1), wfPara); workflowInstance.Start(); scheduler.RunWorkflow(workflowInstance.InstanceId); } void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e) { if (e.OutputParameters.ContainsKey("Result")) { Result = (string)e.OutputParameters["Result"]; } } }}

 

好了,下面,在WF项目中的Workflow1,拖入一个Code控件,如下图

为CodeActivety1.添加事件代码,方法名字可以自己取,也可以用默认的,我这里用了一个Exefun的方法名,

代码如下

 

namespace WF{    public sealed partial class Workflow1 : SequentialWorkflowActivity    {        public string Name { get; set; }        public string Result { get; set; }        public Workflow1()        {            InitializeComponent();        }        private void ExeFun(object sender, EventArgs e)        {            Result = "你好:" + Name;        }    }}

好了,编译一下程序,在TextBox中输入字符串,点击按钮看一下。

Workflow Foundation 透视
工作流是一组同软件或人交互的活动,以及活动间的联系,可以像一个流程图,也可以像一个状态机。

[图一,左边是流程图,右边是状态机]

 

什么是微软Workflow Foundation?

微软Workflow Foundation 是一组由基础运行组件和开发工具组成的工作流开发平台,它不是一个工作流产品。

Workflow Foundation 中的工作流模式

Workflow Foundation 中的工作流模式分为顺序工作流和状态机工作流两种。

 

什么是顺序工作流(Sequential Workflow)?

顺序工作流的执行过程是一个连续的活动序列,它在完成一个活动之后会去执行下一个活动,它允许分支和循环以及接收外部事件,但是只向前执行。

 

什么是状态机工作流(State Machine Workflow)?

一些业务过程在进行中呈现出不同的状态,在Workflow Foundation中用状态机来表示实际业务过程中的状态。状态机工作流由一组状态组成,每个状态可以接收一组事件,由事件来决定状态之间的转换,这样就实现了工作流的执行过程。

Workflow Foundation 架构

 

基础活动库/自定义活动库(Base Activity Library/Custom Activity Library)
运行时引擎(Runtime Engine)
运行时服务(Runtime Services)

 

活动库为工作流提供基本的元件,每个活动是相对独立的可执行单元。

运行时引擎为工作流提供运行环境,管理工作流的生命周期。
运行时服务会在运行时引擎中加载,他们为工作流提供辅助的服务。

 

Workflow Foundation 中的运行时服务包括:

计划服务(管理工作流的工作方式):DefaultWorkflowSchedulerService、ManualWorkflowSchedulerService。
批处理服务:DefaultWorkflowCommitWorkBatchService,SharedConnectionWorkflowCommitWorkService。
持久化服务(将工作流实例存储在硬盘上):SqlWorkflowPresistenceService。
跟踪服务:SqlTrackingService,SqlTrackingQuery。

以上服务均要通过运行时引擎(Workflow Runtime)加载。

 

Workflow 如何与外部交互?

组成Workflow的每一个Activity都可以接收外部事件,由Workflow接受的接口中的事件可将外部数据发送到工作流,工作流通过方法将数据发送给外部。

Workflow Foundation 如何支持分布式应用?
Workflow Foundation 内建支持基于Web Service 与 WCF 的分布式应用。在基础活动库中提供了通用的Web Service活动。

通过WebServiceInputActivity、WebServiceOutputActivity将工作流发布为Web服务。

通过InvokeWebServiceActivity调用Web服务。

 

Workflow Foundation 开发基本过程包括哪些?

1、分析业务流程,提取功能点并封装成Activity,可以利用微软的基础Activity库与自定义Activity组合。
基础Activity实现通用操作,自定义Activity实现业务。

2、利用微软提供的Workflow Designer 组织Activity 配置控制逻辑

3、找到Workflow与应用程序的交互点,通过定义接口使应用程序与Workflow建立协作关系,在应用程序中实现这些接口

4、根据业务需要为工作流配置运行时要启用的服务,如持久化、计划服务等。

 

Workflow Foundation 运行环境/开发环境

运行环境:
Windows Vista
Windows XP
Windows 2003

开发环境:

Visual Studio 2005+Visual Studio 2005 Extensions for .net 3.0( Workflow Foundation )
Visual Studio 2008

 

见微知著 — 从一小段代码观察Workflow Foundation

一段工作在Asp.net的全局代码:

  1. void Application_Start(object sender, EventArgs e)
  2.      {
  3.         //创建工作流运行时实例
  4.          System.Workflow.Runtime.WorkflowRuntime workflowRuntime =
  5.         new System.Workflow.Runtime.WorkflowRuntime();
  6.         //创建工作流计划服务并在运行时服务中加载
  7.          System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService manualService =
  8.         new System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService();
  9.          workflowRuntime.AddService(manualService);
  10.         //启动工作流运行时
  11.          workflowRuntime.StartRuntime();
  12.         //存储工作流运行时实例到Application对象 这是Asp.net中的全局对象
  13.          Application["WorkflowRuntime"] = workflowRuntime;
  14.      }
  15. 一段工作Asp.net页中的代码:
  16. protected void StartRuntime_Click(object sender, EventArgs e)
  17.      {
  18.         //引用工作流运行时对象
  19.          WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;
  20.         //从运行时对象中取出计划服务实例
  21.          ManualWorkflowSchedulerService manualScheduler =
  22.          workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService))
  23.         as ManualWorkflowSchedulerService;
  24.         //通过运行时对象创建一个类型为ASPNetSequentialWorkflow的顺序工作流实例
  25.          WorkflowInstance instance = workflowRuntime.CreateWorkflow(
  26.         typeof(ASPNetSequentialWorkflow));
  27.         //启动工作流实例
  28.          instance.Start();
  29.         //让工作流实例参与计划服务
  30.          manualScheduler.RunWorkflow(instance.InstanceId);
  31. }

MS Workflow Foundation 微软工作流简介

 1.系统必备

—我们需要安装这是
Visual Studio 2005 extensions for .NET Framework 3.0 (Windows Workflow Foundation)。我们必备的开发组件。
—WF作为net3.0的一部分发布,要运行需要安装net3.0
— WF提供了一个在VS2005中可视化设计工作流的设计器,Visual Studio 2005 Extensions for Windows Workflow Foundation,只有安装后才能在VS2005中建立WF项目。
2.WF是什么?
—WF本身并不是一个业务平台,它只是为开发人员提供创建工作流软件的一个平台,也就是说WF不是工作流应用平台,而是一个开发工作流应用的平台。

 —MS将WF作为Vista的一个基本API发布,而不是一个独立的软件(如BizTalk,Office)。

3.WF适合做什么?

 —使用WF可以开发具有以下特点的工作流平台:

    1.业务流程辅助办公软件

2.软件内部工作的顺序控制
3.自动筛选查询类系统
4.自动化控制中

4.WF的工作模式

—WF提供了两类工作流模式,流模式(Sequential)与状态机模式(State Machine ):

 —顺序工作流 非常适合以下类型的操作,即该操作由依次执行直至最后一个活动完成的步骤的管线表示。但是,顺序工作流的执行并非完全是顺序的。它们仍然可以接收外部事件或者启动并行任务,在这种情况下,确切的执行顺序可能有所不同。

—状态机工作流 由一组状态、转换和操作组成。首先,将一个状态表示为起始状态,然后,基于事件执行向另一个状态的转换。状态机工作流可以具有确定工作流结束的最终状态。

—可以简单的将状态机模式看成是有交互点与Goto指令的流模式。设计工作流,其实没有什么应该的模式,用状态机模式作主流程,管理业务状态,流模式作子流程,完成具体的业务操作是一个不错的方案。

5.工作流活动的分类

—WF为工作流设计提供了一系列的Activity控件,从型式上分为两类:
简单活动类:(System.Workflow.ComponentModel.Activity)
活动容器类:(System.Workflow.ComponentModel.CompositeActivity)
Activity <- CompositeActivity 

—包括以下具体控件:

CodeActivity:可以添加代码,
IfElseActivity:类似于if语句,
SuspendActivity:类似于线程挂起语句,
DelayActivity:类似于线程休眠语句 ,
CallExternalMethodActivity:类似于调用方法语句,
HandleExternalEventActivity:类似于触发事件语句,
WhileActivity:类似于While语句,
terminateActivity: 类似于终止语句,
ThrowActivity:类似于自定义异常语句,
ConditionedActivityGroup:有点像foreach语句,
replicatorActivity:有点像for语句
PolicyActivity:有点像职责链

— 可以用InvokeWebServiceActivity调用WebService
—可以用WebServiceInputActivity ,WebServiceOutputActivity 将工作流发布成WebService

 —可以用InvokeWorkflowActivity调用子流程

还有一些用于控制流程、控制状态、事务处理、异常处理的控件

6.工作流模版和实例

—WF的工作流模板可以是一个编译成DLL的NET类库文件,也可以是一个用XML描绘结点关系的字符串,工作流实例是每个用户依据模板定义的轨道实现具体业务的一组状态数据,实例要在引擎中运行,实例可以保存到数据库或磁盘文件中。

—工作流提供了一个运行实例的引擎,引擎不是以一个独立服务的方式发布的,而是可以独立线程的方式寄生在任意进程中。被寄生的程序叫宿主,宿主与引擎可以通过接口进行交互,控制引擎以及与引擎中的工作流实例通信。引擎中可以同时运行多个实例,宿主中可以同时运行多个引擎。

7. WF提供了的服务

—1.持久化服务
WF提供了SqlWorkflowPersistenceService,用于将实例持久化到一数据库 中,SqlWorkflowPersistenceService的数据库生成文件在[系统盘 WindowsMicrosoft.NETFrameworkv3.0Windows Workflow FoundationSQLEN]下SqlPersistenceService_Schema.sql与 SqlPersistenceService_Logic.sql

—也可派生PersistenceService,建立自定义持久化服务

—2.监听(跟踪)服务
WF提供了SqlTrackingService,用于监听实例的运行状态,并将状态保存到数据 中,SqlTrackingService的数据库生成文件在[系统盘 WindowsMicrosoft.NETFrameworkv3.0Windows Workflow FoundationSQLEN]下Tracking_Schema.sql与Tracking_Logic.sql 使用 SqlTrackingQuery,可以从数据库中查询实例的状态。

 —也可派生TrackingService,建立自定义监听服务对要监听的内容,可以自定义 TrackingProfile,进行筛选

—3.数据通信服务
WF提供了ExternalDataExchangeService,用于实现宿主与实例的通信,CallExternalMethodActivity与HandleExternalEventActivity依赖于该服务。

 —4.还有其他一些服务,如ManualWorkflowSchedulerService,以单程方式运行实例,在实例有与外部设备交互时非常有用.

8. WF高级特性
—1.可以自定义流程设计器
WF提供了System.Workflow.ComponentModel.Design.WorkflowView控件,该控件可以用图形的方式显示工作流结构。
—2.可以用WorkflowChanges在实例运行时使用,动态添加删除结点。
—3.可以用WorkflowMarkupSerializer将工作流模板类转换为XML字串格式 
—4.WF为流程控制类Activity提供了规则对象。

 —5.WF提供了WorkflowRole对象,可以自定义角色,使用AD角色、使用ASP.NET2.0角色。

9.关于通信

—很多人有一个习惯就是从引擎中得到实例,然后直接操作,这个方式是单线程开发中常用的,不用考虑资源访问冲突,但在WF中实例与宿主、引擎的关系,就像操作多线程资源一样,实例被引擎线程专控,宿主要与实例通信不能直接进行,要通过一个专用通道。

 — 1.可以使用启动参数,动态结点,插入队列的方式实现宿主与引擎中的实例推方式通信;

— 2.也可以在设计时使用CallExternalMethodActivity,HandleExternalEventActivity,或自定义状态点的方式实现宿主与引擎中的实例拉模式的通信。

转载地址:https://blog.csdn.net/thy822/article/details/5070050 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:MSTR如何添加基于登录用户的动态安全筛选
下一篇:Windows workflow foundation入门

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月30日 17时11分46秒