workflow并行活动(一)

by Kade 8. July 2009 16:46

使用Parallel 活动:

Parallel 活动是一个组合活动,但它只支持Sequence 活动作为它的子活动。(当然,你可自由地把你想使用的任何活动放到该Sequence 活动中。)它至少需要两个Sequence 活动。

由于Sequence活动并没有在单独的线程上执行,所以Parallel活动并不是一个多线程活动。

下面具体弄个例子来看看Parallel活动的用法:

首先在Visual Studio中建立如下图的一些项目(这些项目在之前已经介绍过怎么做,子此处就不累述了)

现在在VS里找到Workflow1工作流设计视图,在里面添加一些活动。首先添加的就是Parallel 活动,如下图:

 

接下来的任务就是在俩个Sequence 活动里面各添加俩个Code活动,需添加的一些事件名称和代码如下:

 

找到ParallelHelloWorld项目,在项目级添加对ParallelFlow的引用,打开program.cs文件,在里面找到下面的一行代码:

Console.WriteLine("Waiting for workflow completion.");

在它下面添加如下代码即完成整个项目:

// Create the workflow instance.

WorkflowInstance instance =

workflowRuntime.CreateWorkflow(typeof(ParallelFlow.Workflow1));

// Start the workflow instance.

instance.Start();

运行该解决方案,你会看到如下图的运行结果:

在上图的运行结果中你会看到结果是乱的,这正是我们需要的结果,因为Parallel 活动是一个并行活动。

 

 

使用SynchronizationScope 活动

为了协调并行执行路径,我们下面来介绍下SynchronizationScope活动,它要解决的是同步问题,其作用是完成临界代码区的执行过程及volatile 内存的存取。

当你把一个SynchronizationScope 活动放到你的工作流中的时候,WF 会保证在该执行上下文切换到其它的并行路径以前,该组合活动(指SynchronizationScope 活动)内部的所有活动都将全部运行完成。这意味着你能在SynchronizationScope 内部访问所有的volatile内存和完成临界区代码的执行。

SynchronizationScope 使用的机制和互斥(mutex)相似。

同样我们还是用一个简单的例子来介绍SynchronizationScope活动的使用:我们把SynchronizationScope 活动运用到前面的示例应用程序中,来迫使这些信息以一个恰当的顺序输出。

同样我们Visual Studio中建立如下图的一些项目:

 

在解决方案中找到workflow.cs的设计界面,首先添加一个Parallel 活动,然后在Parallel 活动的左右俩边Sequence 活动里各添加一个SynchronizationScope活动。设置SynchronizationScope活动的SynchronizationHandles属性(SynchronizationHandles 其实是一个字符串集合,它们中的每一个字符串的作用是和要进行同步处理的其它的SynchronizationScope 对象建立联)为SyncLock

备注:你在SynchronizationHandles 属性中输入的文本字符串并不重要。重要的是所有要被同步的SynchronizationScope 活动都要使用相同的文本字符串。

然后在SynchronizationScope 活动里添加一些Code活动,要添加的事件名和代码如下:

 

 

SynchronizedHelloWorld项目里添加对SynchronizedFlow的引用,为了调用工作流同样在program.cs文件添加如下代码:

// Create the workflow instance.

WorkflowInstance instance =

workflowRuntime.CreateWorkflow(typeof(SynchronizedFlow.Workflow1));

// Start the workflow instance.

instance.Start();

编译运行,可以看到如下图的结果:

Tags:

技术文章

workflow调用

by Kade 6. July 2009 17:31

 

对于在一个工作流中调用另外一个工作流,我在此搞个简单的例子:

1.       VS2008中打开项目,选择一个控制台应用程序,取名为Invoker,接受添加个数据工厂(前面已经介绍过,在此就不在累述了)。

2.  接下来添加一个新的基于顺序工作流库的项目,工作流的名称命名为:Workflow1,保存该项目。在设计界面添加个CODE活动,在该活动的ExecuteCode 属性中键“SayHello”,然后按下回车键。SayHello 方法,在该方法内输入下面的代码:

Console.WriteLine("Hello from Workflow1!")

3.  同(2),不过命名为Workflow2,同样代码改为

Console.WriteLine("Hello from Workflow2!")

4.        生成workflow1,为workflow1添加对workflow2的项目级引用。

5.        完成这些之后,在workflow1的设计界面里拖一个invokeworkflow活动到code活动的下面,设置它的targetworkflow属性,点击他的浏览()。不过在这之前,你要先重新生成解决方案,否则在下图里看不到workflow2

 

6..        完成这些之后你就能看到workflow1的设计界面的变化了。如下图:

 

7.        Invoker里添加对workflow1workflow2的项目级引用,并在program.cs里面添加如下代码:

WorkflowInstance instance =

workflowRuntime.CreateWorkflow(typeof(Workflow1.Workflow1));

instance.Start();

并在WorkflowCompleted里面添加如下代码:

         if (e.WorkflowDefinition is Workflow1.Workflow1)

Console.WriteLine("Workflow 1 completed.");

else

Console.WriteLine("Workflow 2 completed.");

waitHandle.Set();

现在就可以看看运行结果了!

 

Tags:

技术文章

workflow跟踪

by Kade 3. July 2009 16:50

WF 事件跟踪中经常使用的对象可以分为俩类:跟踪数据检索和跟踪详细说明。跟踪检索对象,如SqlTrackingQuery,一旦跟踪数据被存储到数据库中,你可使用它们采集跟踪数据。跟踪详细说明对象,如跟踪点和位置对象,允许你能在工作流代码中控制该跟踪什么。

WF 由一个主要的跟踪服务:SqlTrackingService (一般用在sql server 2005)承载。

1.使用SqlTrackingService 进行工作流事件跟踪:

SqlTrackingService添加到工作流运行时中,就可以跟踪工作流的处理过程。当跟踪的事件激发时,WF 创建并管理跟踪记录。

1设置SQL Server 进行跟踪

首先在sql server 2005中建立一个数据库用以保存跟踪信息。然后需运行一些由WinFX 组件提供的SQL 脚本,这些脚本将创建数据库角色、表和视图、 必须的存储过程以和你的工作流进行交互。(这些脚本的位置一般在是C:\Widows

\Microsoft.NET\Framework\3.0\Windows  Workflow  Foundation\ SQL\

ZH-CHS,)。用到的俩个脚本是Tracking_Schema.sql (建立一些表)文件和Tracking_Logic.sql(建立一些存储过程)

2使用SqlTrackingServer 服务

为了方便,我们就建立一个新的工作流,在此处我补充一下数据工厂:(数据工厂能使我们只建立一个单一workflowruntime实例)就是在项目中添加一个类型为类的新项(当然一些命名空间的引入也是必须的)

一般代码如下(功能比较简单):

完成这些之后,接下来就来为我们的工作流添加SqlTrackingService

首先,要为WorkflowTracker 应用程序 添加System.Configuration 引用,我们需要它来把访问数据库的连接字符串存储到应用程序的配置文件里。然后为WorkflowTracker 应用程序添加一个应用程序配置文件。在该配置文件里之需要设置连接字符串的内容(连接到刚才建立的数据库)。接下来在数据工厂文件里添加一些引用个代码。

using System.Workflow.Runtime.Tracking;

using System.Configuration;

WorkflowFactory.cs 文件中,找到我们创建WorkflowRuntime 实例的地方,在这里我们需要为 WorkflowRuntime 引入SqlTrackingService。在GetWorkflowRuntime 方法中

添加下面的代码:

String conn = ConfigurationManager.ConnectionStrings["TrackingDatabase"].ConnectionString;

_workflowRuntime.AddService(new SqlTrackingService(conn));

假如工作流运行正常,你可在WorkflowTracking 数据库的ActivityInstance 表中看到下图中显示的结果:

 

添加之后我们要对workflow1的设计界面进行修改:添加的一些活动和位置关系如下图:

 

Workflow1.cs的完整代码如下:

完成这些之后,接下来就来为我们的工作流添加SqlTrackingService

首先,要为WorkflowTracker 应用程序 添加System.Configuration 引用,我们需要它来把访问数据库的连接字符串存储到应用程序的配置文件里。然后为WorkflowTracker 应用程序添加一个应用程序配置文件。在该配置文件里之需要设置连接字符串的内容(连接到刚才建立的数据库)。接下来在数据工厂文件里添加一些引用个代码。

using System.Workflow.Runtime.Tracking;

using System.Configuration;

WorkflowFactory.cs 文件中,找到我们创建WorkflowRuntime 实例的地方,在这里我们需要为 WorkflowRuntime 引入SqlTrackingService。在GetWorkflowRuntime 方法中

添加下面的代码:

String conn = ConfigurationManager.ConnectionStrings["TrackingDatabase"].ConnectionString;

_workflowRuntime.AddService(new SqlTrackingService(conn));

假如工作流运行正常,你可在WorkflowTracking 数据库的ActivityInstance 表中看到下图中显示的结果。

 

Tags:

技术文章

WorkFlow(顺序工作流)

by Kade 3. July 2009 13:16

顺序工作流的使用:

顺序工作流就是按照事先预定好的顺序一步一步的执行。

1.建立一个顺序工作流应用程序

1)打开Microsoft Visual Studio 2008

2)在文件菜单上,选择新建项目。然后将呈现新项目对话框。

3)在项目类型面板中,展开Visual C#树形节点,呈现出基于workflow 项目的模板。

4)在模板面板中,点击顺序工作流控制台应用程序或顺序工作流库。前者创建一个可执

行的应用程序并以控制台的方式执行,而后者创建一个动态链接库并在其它应用程序中使用。

5)输入你的项目或应用程序的名称。

6)输入或选择你想保存你的项目的所在路径。

7)点击确定,Visual Studio 2008 将为你建立一个基本项目,其中包含workflow 视图

设计器用户界面。

2.给个具体的例子(就拖一个ifelse和俩个code活动):

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

1)启动Visual Studio 2008

2)创建顺序工作流控制台应用程序项目 

 

3)项目名称中输入PCodeFlow

4)点击确定,将自动生成下面的初始界面

 

完成了以上工作之后,Workflow 项目生成了两个文件:

Program.cs:从许多方面可以看出,这是一个典型的控制台应用程序源文件。然而,这个

模板增加了大量代码来支持Workflow 的操作。

Workflow1.cs:这是一个Workflow 组件,我们将对其进行修改以实现我们需要的功能。

5)在工具箱里选择一些控件添加到设计界面上,设置一些相关的属性。

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

 

在上图中你会看到一个!号,这是workflow 视图设计器在告诉 你workflow 并不完整。在这里必须设置“condition”属性,在属性值里有三个选项可供选择,在这里选择“代码条件”。完成这些之后,“condition”属性就会包含个子属性,该子属性的名字也是“condition”,这个属性需要输入要添加的内部事件的名字(sfghffghs)。完成这些之后会跳到workflow的后台代码(如图一),在此处添加刚刚添加事件的代码以完成条件的判断。

 

                                                                                 图一

拖一个“Code”活动到workflow 视图设计器上,并放到左边分支(ifElseBranchActivity1)的区域内;同样拖一个“Code”活动到workflow 视图设计器上,并放到右边分支(ifElseBranchActivity1)的区域内。就像先前添加条件判断的代码一样,我们将为该分支添加被选中时执行的代码。单击codeActivity1”和“codeActivity2”图标以在属性面板中激活它的属性。在“ExecuteCode”属性中输入事件名字(asdgfdhhnyhvfjmgyw)。做完这些之后同样会跳到workflow的后台代码(如图二),在此处添加功能代码。

                                               图二

6)在Program.cs文件里通过“WorkflowRuntime”对象和“WorkflowInstance”对象来实现对工作流的调用。

具体方法:

WorkflowInstance instance =

workflowRuntime.CreateWorkflow(typeof(PCodeFlow.Workflow1))

在在Program.cs文件里注意WorkflowInstanceWorkflowRuntime这俩个对象的运用,把握他们一些方法的使用和时机。

总的来说:在项目中用到顺序工作流时,就是让一些需要自动执行的功能让workflow去完成,在工作流的设计界面里面的工具箱里有许多控件为其提供了方便,一般用到的是ifelse活动(根据条件来选择分支)、code活动(在该活动中添加具体功能的事件处理函数代码)、throw活动(抛出异常)等等,对一些常用控件要熟练的掌握。然后在宿主程序里面调用工作流实例。

Tags:

技术文章

Copyright © 2009 APJ Software

最新评论

Comment RSS

公告

欢迎使用APJ Blog!

日历

<<  May 2012  >>
MoTuWeThFrSaSu
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

View posts in large calendar