一起学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表中看到写入的数据。
简单的先说到这,东西有点多,下面接着讨论。本节可以对以前做一次复习。
- 一起学WF3.5【7】
- 一起学WF3.5【5】
- 一起学WF3.5【1】
- 一起学WF3.5【2】
- 一起学WF3.5【3】
- 一起学WF3.5【4】
- 一起学WF3.5【6】
- 一起学WF3.5【8】
- 一起学WF3.5【9】
- 一起学WF3.5【10】
- 一起学WF3.5【11】
- 一起学WF3.5【12】
- 一起学WF3.5【13】
- 一起学WF3.5【14】
- wf3
- 一起学WCF【5】
- 一起学Kotlin(5)
- 《一起学》系列7:进程、线程模型
- POJ 3126 Prime Path 解题报告(BFS & 双向BFS)
- Qt网络编程之QNetworkReply
- Java开发中所需要的jar包
- 传智播客C/C++学院年薪24-50万招聘C/C++讲师
- 数据分析方法
- 一起学WF3.5【7】
- OpenCV和MFC一起用的时候出现内存泄露
- Hdu 4634 DP|最短路
- #杂问#什么是servlet??
- HowTo: Use grep Command In Linux / UNIX – Examples
- Python下的字符串函数
- [unity基础教程]Unity3D中世界坐标转如何化成屏幕坐标?
- vimrc
- .net学科-杨中科-Unity3D视频教程