我们通过一个例子说明上文所说的跟踪服务的使用。
一个使用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表中看到写入的数据。