一起学WF3.5【7】

来源:互联网 发布:java合成多张图片 编辑:程序博客网 时间:2024/05/22 05:40

我们通过一个例子说明上文所说的跟踪服务的使用。

一个使用SqlTracingService进行工作流跟踪的例子

创建一个跟踪数据库

WF为使用Sql Server提供了内置的创建支持。

创建一个名为WorkflowTracking的数据库,在C:\Windows\Microsoft.NET\Framework\3.0\WindowsWorkflow Foundation\SQL\ZH-CHS,在新建的数据库中执行Tracking_Schema.sql脚本,再执行Tracking_Logic.sql脚本。这些脚本将创建数据库角色、表和视图及存储过程以和你的工作流进行交互。

 

仿照前边的例子创建一个工作流

回想一下我们前面创建工作流的过程。在这里把工作流程序和宿主程序分开。

首先我们创建一个顺序工作流库项目,命名为TrackedWorkflow。

打开工作流设计器。拖入一个IfElse活动,如下图。

在左侧的分支上单击,激活它的属性。

在它的Condition属性中选择“代码条件”。点左侧的加号,在展开的Condition子属性中输入方法名QueryDelay。这个方法将决定执行IfElse活动的哪个分支。

接着我们将一个Code活动到IfElse的左边分支上。我们在活动的惊叹号上点击打开它的属性面板。在ExecuteCode属性中输入PreDelayMessage。

像前面做过的一样,我们在左侧分支继续拖入一个Delay活动和一个Code活动。设置Delay活动的属性活动延时10秒,第二个Code活动执行一个名称为PostDelayMessage的方法。完成后如下图:

 

设计器的工作完成后我们添加代码。在工程中添加引用:System.Window.Forms,在Workflow.cs添加:using System.Windows.Forms;

在生成的PreDelayMessage函数中添加:

MessageBox.Show(“Pre-delaycode is being executed.”);

PostDelayMessage中添加:

MessageBox.Show("Post-delay code isbeing executed.");

在QueryDelay中添加以下代码:

privatevoid QueryDelay(object sender, ConditionalEventArgs e)

        {

            e.Result= false; // 假定我们不延时...

            if(MessageBox.Show("Okay to execute delay in workflow processing?",

                 "Query Delay",

                 MessageBoxButtons.YesNo,

                 MessageBoxIcon.Question) == DialogResult.Yes)

            {

               // 需进行延时处理

               e.Result = true;

 

               // 显示消息

               Console.WriteLine("Delay path taken...");

            }// if

           else

            {

               // 显示消息

               Console.WriteLine("Delay path NOT taken...");

            }// else

        }

 

接下来创建一个控制台程序。添加System.Workflow.Activities、System.Workflow.ComponentModel、System.Workflow.Runtime,并添加对TrackedWorkflow的引用。

我们直接把之前在workflowHost中创建的WorkflowFactory.cs复制到本工程下,注意修改命名空间。

同样像在workflowHost中的Program.cs中一样,在Main函数前添加:

private static AutoResetEvent waitHandle =new AutoResetEvent(false);

 

在Main函数中添加:

WorkflowRuntime workflowRuntime =WorkflowFactory.GetWorkflowRuntime();

workflowRuntime.WorkflowIdled += newEventHandler<WorkflowEventArgs>(workflowIdled);

workflowRuntime.WorkflowCompleted += newEventHandler<WorkflowCompletedEventArgs>(workflowCompleted);

workflowRuntime.WorkflowTerminated += newEventHandler<WorkflowTerminatedEventArgs>(workflowTerminated);

在Main函数外添加三个响应函数:

staticvoid workflowTerminated(object sender, WorkflowTerminatedEventArgs e)

        {

           Console.WriteLine("Workflow instance terminated.");

           waitHandle.Set();

        }

 

        // The"completed" event handler (ran to completion, no errors).

        staticvoid workflowCompleted(object sender, WorkflowCompletedEventArgs e)

        {

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

           waitHandle.Set();

        }

 

        // The"idled" event handler.

        staticvoid workflowIdled(object sender, WorkflowEventArgs e)

        {

           Console.WriteLine("Workflow instance idled.");

        }

 

以上只是借用workflowHost中的一些代码。

在Main函数最后添加:Console.WriteLine("Waiting for workflow completion.");

WorkflowInstance instance =workflowRuntime.CreateWorkflow(typeof(TrackedWorkflow.Workflow1));

instance.Start();

waitHandle.WaitOne();

 

编译运行。

 

添加SqlTrackingService

准备工作完成了,现在我们添加代码以执行跟踪。

 

在主程序中添加一些逻辑。首先添加System.Configuration引用,用它把数据库的连接字符串存储到应用程序配置文件里。

添加一个名为App.config文件。在文件中添加:

<connectionStrings>

<addname="TrackingDatabase"connectionString="Data Source=localhost;InitialCatalo

g=WorkflowTracking;IntegratedSecurity=True;"/>

</connectionStrings>

 

在WorkflowTracker的WorkflowFactory.cs文件中,添加名称空间:

using System.Workflow.Runtime.Tracking;

using System.Configuration;

在GetWorkflowRuntime方法中添加如下代码:

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

_workflowRuntime.AddService(newSqlTrackingService(conn));

 

编译,执行。可以在WorkflowTracking数据库的ActivityInstance表中看到写入的数据。

 

简单的先说到这,东西有点多,下面接着讨论。本节可以对以前做一次复习。
原创粉丝点击