- 浏览: 114665 次
- 来自: ...
文章分类
最新评论
-
Juanjuel:
Django多表查询 -
chenokia:
那么在\grails-app\conf 下的DataSourc ...
Grails如何使用外部配置文件 -
viking2439:
有没有方法去指定用户去获得某个权限呢?
[django]总结Django中的用户权限模块
这几天在研究Windows Workflow Foundation,天天上www.windowsworkflow.net 的论坛上查看和询问,全都是英文,头都看大了,对这金山词霸一个一个的啃。闲话少说,步入正题吧!
本篇主要讲WF在asp.net运用。如下:
我的流程设置如下:
设置了一个CodeActive和一个HandleExternalEventActive
CodeActive是执行一段代码的Active
HandleExternalEventActive是外联一个Event的Active
首先,配置web.config
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<configSections>
<section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</configSections>
<appSettings/>
<connectionStrings/>
<system.web>
<authentication mode="Windows"/>
<compilation debug="true">
<assemblies>
<add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Workflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Workflow.ComponentModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="Microsoft.Build.Utilities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="Microsoft.Build.Framework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
</system.web>
<!--注册服务-->
<WorkflowRuntime Name="WorkflowServiceContainer">
<Services>
<add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add type="System.Workflow.Activities.ExternalDataExchangeService, System.Workflow.Activities, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" UnloadOnIdle="true" ConnectionString="Initial Catalog=PersistenceStore;Data Source=localhost;Integrated Security=SSPI;"/>
<add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" ConnectionString="Initial Catalog=TrackingStore;Data Source=localhost;Integrated Security=SSPI;"/>
</Services>
</WorkflowRuntime>
<!--设置追踪,会在网站根目录下出现WFTrace.log文件-->
<system.diagnostics>
<switches>
<add name="WorkflowTraceToDefault" value="1" />
<add name="Host" value="All" />
<add name="Runtime" value="All" />
<add name="Tracking" value="All" />
<add name="Activity" value="All" />
<add name="Rules" value="All" />
</switches>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="WFTrace.log" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
简单介绍上面的配置文件
a.注册服务
这里是将一些服务注册到 Workruntime中,你也可以在代码中使用AddServcie中注册服务。
注册好服务后,就可以在代码中
ExternalDataExchangeService dataService = workflowRuntime.GetService<ExternalDataExchangeService>();
以上方式得到服务。
b.跟踪
配置跟踪信息,非常有用,我有一次调试的时候,MSDTC 服务没有启动的错误,就是查看WFTrace.log文件而获得的。
然后,在Global中启动一个WorkRunTime
接着,就可以在程序中运行workflow了
最后,运行代码后,当运行完上图中的CodeActive后,该workflowinstance将进入等待状态(会触发workflowRuntinme的WorkflowIdled事件)。
这个时候你如果注册了SqlWorkflowPersistenceService服务,和创建了PersistenceStore数据库,则会将此
工作流保存到数据库中,已备下次使用,关于这块下次我再整理。
为什么工作流会等待了,
因为接下来的环节HandleExternalEventActive的Active必须需要触发了和他相关联的事件后,他才会继续的。
所以,我可以针对workflowRuntinme增加WorkflowIdled事件,实现事件的代码如下:
这样这个工作流就整个的执行完成了。
本篇主要讲WF在asp.net运用。如下:
我的流程设置如下:
设置了一个CodeActive和一个HandleExternalEventActive
CodeActive是执行一段代码的Active
HandleExternalEventActive是外联一个Event的Active
首先,配置web.config
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<configSections>
<section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</configSections>
<appSettings/>
<connectionStrings/>
<system.web>
<authentication mode="Windows"/>
<compilation debug="true">
<assemblies>
<add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Workflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Workflow.ComponentModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="Microsoft.Build.Utilities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="Microsoft.Build.Framework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
</system.web>
<!--注册服务-->
<WorkflowRuntime Name="WorkflowServiceContainer">
<Services>
<add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add type="System.Workflow.Activities.ExternalDataExchangeService, System.Workflow.Activities, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" UnloadOnIdle="true" ConnectionString="Initial Catalog=PersistenceStore;Data Source=localhost;Integrated Security=SSPI;"/>
<add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" ConnectionString="Initial Catalog=TrackingStore;Data Source=localhost;Integrated Security=SSPI;"/>
</Services>
</WorkflowRuntime>
<!--设置追踪,会在网站根目录下出现WFTrace.log文件-->
<system.diagnostics>
<switches>
<add name="WorkflowTraceToDefault" value="1" />
<add name="Host" value="All" />
<add name="Runtime" value="All" />
<add name="Tracking" value="All" />
<add name="Activity" value="All" />
<add name="Rules" value="All" />
</switches>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="WFTrace.log" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
简单介绍上面的配置文件
a.注册服务
这里是将一些服务注册到 Workruntime中,你也可以在代码中使用AddServcie中注册服务。
注册好服务后,就可以在代码中
ExternalDataExchangeService dataService = workflowRuntime.GetService<ExternalDataExchangeService>();
以上方式得到服务。
b.跟踪
配置跟踪信息,非常有用,我有一次调试的时候,MSDTC 服务没有启动的错误,就是查看WFTrace.log文件而获得的。
然后,在Global中启动一个WorkRunTime
void Application_Start(object sender, EventArgs e)
{
System.Workflow.Runtime.WorkflowRuntime workflowRuntime = new System.Workflow.Runtime.WorkflowRuntime("WorkflowRuntime");
Application["WorkflowRuntime"] = workflowRuntime;
System.Workflow.ComponentModel.Compiler.TypeProvider typeProvider = new System.Workflow.ComponentModel.Compiler.TypeProvider(workflowRuntime);
typeProvider.AddAssembly(typeof(WorkflowLibrary1.Workflow1).Assembly);
workflowRuntime.AddService(typeProvider);
workflowRuntime.StartRuntime();
}
void Application_End(object sender, EventArgs e)
{
System.Workflow.Runtime.WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
workflowRuntime.StopRuntime();
}
{
System.Workflow.Runtime.WorkflowRuntime workflowRuntime = new System.Workflow.Runtime.WorkflowRuntime("WorkflowRuntime");
Application["WorkflowRuntime"] = workflowRuntime;
System.Workflow.ComponentModel.Compiler.TypeProvider typeProvider = new System.Workflow.ComponentModel.Compiler.TypeProvider(workflowRuntime);
typeProvider.AddAssembly(typeof(WorkflowLibrary1.Workflow1).Assembly);
workflowRuntime.AddService(typeProvider);
workflowRuntime.StartRuntime();
}
void Application_End(object sender, EventArgs e)
{
System.Workflow.Runtime.WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
workflowRuntime.StopRuntime();
}
接着,就可以在程序中运行workflow了
private void StartWorkflow()
{
WorkflowRuntime workflowRuntime = StartRuntime();
// Now get a refernece to the ManualWorkflowSchedulerService
ManualWorkflowSchedulerService scheduler =
workflowRuntime.GetService<ManualWorkflowSchedulerService>();
// Attach to the WorkflowCompleted event
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(WorkflowRuntime_WorkflowCompleted);
WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1));
workflowInstance.Start();
// Now run the workflow. This is necessary when
// using the ManualWorkflowSchedulerService
scheduler.RunWorkflow(workflowInstance.InstanceId);
}
private WorkflowRuntime StartRuntime()
{
WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;
ExternalDataExchangeService dataService = workflowRuntime.GetService<ExternalDataExchangeService>();
OrderLocalServices.OrderService orderService = workflowRuntime.GetService<OrderLocalServices.OrderService>();
if (orderService == null)
{
orderService = new OrderLocalServices.OrderService();
dataService.AddService(orderService);
}
// Attach to the WorkflowCompleted event
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(WorkflowRuntime_WorkflowCompleted);
return workflowRuntime;
}
{
WorkflowRuntime workflowRuntime = StartRuntime();
// Now get a refernece to the ManualWorkflowSchedulerService
ManualWorkflowSchedulerService scheduler =
workflowRuntime.GetService<ManualWorkflowSchedulerService>();
// Attach to the WorkflowCompleted event
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(WorkflowRuntime_WorkflowCompleted);
WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1));
workflowInstance.Start();
// Now run the workflow. This is necessary when
// using the ManualWorkflowSchedulerService
scheduler.RunWorkflow(workflowInstance.InstanceId);
}
private WorkflowRuntime StartRuntime()
{
WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;
ExternalDataExchangeService dataService = workflowRuntime.GetService<ExternalDataExchangeService>();
OrderLocalServices.OrderService orderService = workflowRuntime.GetService<OrderLocalServices.OrderService>();
if (orderService == null)
{
orderService = new OrderLocalServices.OrderService();
dataService.AddService(orderService);
}
// Attach to the WorkflowCompleted event
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(WorkflowRuntime_WorkflowCompleted);
return workflowRuntime;
}
最后,运行代码后,当运行完上图中的CodeActive后,该workflowinstance将进入等待状态(会触发workflowRuntinme的WorkflowIdled事件)。
这个时候你如果注册了SqlWorkflowPersistenceService服务,和创建了PersistenceStore数据库,则会将此
工作流保存到数据库中,已备下次使用,关于这块下次我再整理。
为什么工作流会等待了,
因为接下来的环节HandleExternalEventActive的Active必须需要触发了和他相关联的事件后,他才会继续的。
所以,我可以针对workflowRuntinme增加WorkflowIdled事件,实现事件的代码如下:
void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"]
OrderService orderService = workflowRuntime.GetService<OrderService>();
WorkflowInstance instance = workflowRuntime.GetLoadedWorkflows()[0];
instance.Load();
//触发相关联的事件
orderService.RaiseOrderUpdatedEvent(instance.InstanceId);
}
{
WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"]
OrderService orderService = workflowRuntime.GetService<OrderService>();
WorkflowInstance instance = workflowRuntime.GetLoadedWorkflows()[0];
instance.Load();
//触发相关联的事件
orderService.RaiseOrderUpdatedEvent(instance.InstanceId);
}
这样这个工作流就整个的执行完成了。
发表评论
-
IBatisNet系列-介绍篇
2006-03-25 14:56 1026IBatisNET从名字就可以看出,他是从Java的IBati ... -
IBatisNet系列二-QuickStart篇
2006-03-25 14:59 974本节我参考官方网站上的Quick Start Guide,网址 ... -
IBatisNet系列-执行存储过程
2006-03-25 15:24 1172映射xml文件书写如下 <?xml version=& ... -
IBatis.Net系列-Mapped Statements的语法
2006-03-29 15:25 888语法:<statement id="state ... -
Castle- Startable Facility 简单理解
2006-03-30 17:56 877最近在研究Castle开源项目,就下午学习Startable ... -
IBatis.Net系列-多参数的SQL语句的配置
2006-04-15 12:15 1454由于本人对IBatis.Net的并不是很精通,也是在边学边工作 ... -
MonoRail学习-介绍篇
2006-04-24 10:22 752刚刚结束了使用Castle MonoRail的一个项目,所以想 ... -
MonoRail学习-入门实例篇
2006-04-24 11:51 1333MonoRail学习目录实例代码下载:/Files/maply ... -
MonoRails学习- Layouts
2006-04-24 12:14 832MonoRail学习目录实例代码:/Files/maplye/ ... -
MonoRail学习-Component
2006-04-24 13:30 741MonoRail学习目录在我们asp.net中,经常有界面代码 ... -
Which Style of Workflow When?[转]
2006-05-24 16:58 756http://blogs.msdn.com/davegreen ... -
WF学习-Console Workflow Application
2006-05-26 16:51 931环境必备:.NET Framework 2.0VS.Net 2 ... -
WF学习-WorkFLow中的参数
2006-05-27 15:46 1164系统和WorkFlow交互有很多种方式,今天介绍的是通过Wor ... -
Castle ActiveRecord.chm
2006-05-31 18:06 758收集 TerryLee's Tech Space 和 SHY5 ... -
使用UserControl时,在Page中定义方式
2006-06-24 10:02 910我们通常,会将一些通用的页面模块作成用户控件,然后加载到页面中 ... -
ASP.Net2.0中自定义控件在page中的注册
2006-06-24 14:15 815今天在网上看到ASP.Net 2.0中注册自定义控件的好方法, ... -
Asp.Net中NHiernate的Session的管理
2006-06-26 11:08 674NHibernate中的Session,在我的理解似乎就相当于 ... -
GridView使用一些记录
2006-06-30 10:45 971现在有个项目开始使用ASP.NET 2.0开发,在开发过程中关 ... -
NHiernate中自定义Generator
2006-07-04 13:50 936我的这个自定义的Generator设置如下: <g ... -
NHibernate中使用generator为assigned的问题
2006-07-04 14:03 1879Hibernate version: 1.0.2.0 Mapp ...
相关推荐
《Professional ASP.NET 3.5 SP1 Edition: In C# and VB》是一本专为开发者设计的专业级编程书籍,深入探讨了ASP.NET 3.5 SP1(Service Pack 1)框架,涵盖了C#和VB两种编程语言的应用。这本书不仅适合初学者,也对...
Customizing your workflows * Accessing your workflows in a variety of ways in a variety of situations * Using WF with Web Services and ASP.NET * Integrating WCF and WF Who this book is for This book ...
ASP.NET 3.5集成了Windows Workflow Foundation(WF),使得开发人员可以在Web应用中轻松实现工作流逻辑。此外,WCF(Windows Communication Foundation)是Microsoft提供的一套用于创建服务通信的应用程序框架,它...
《Sams Teach Yourself ASP.NET in 24 Hours》是一本著名的ASP.NET入门教程,通过24个小时的学习,读者可以掌握构建动态Web应用程序的基础知识。本书涵盖了从基础概念到高级特性的广泛内容,旨在帮助初学者快速上手...
《精通ASP.NET 3.5(C# 2008版)》是针对ASP.NET 3.5框架和C#编程语言的一本深入指南,旨在帮助开发者掌握这一强大的Web开发平台。本书提供了丰富的源码示例,以及英文样章,以辅助读者理解和实践ASP.NET 3.5的关键...
3. **工作流宿主**:理解如何在ASP.NET、WCF服务或独立应用程序中托管工作流。 4. **持久化与恢复**:了解WF如何保存和恢复工作流实例状态,以支持长期运行的流程。 5. **规则和决策**:学习如何使用规则引擎来实现...
而ASP.NET MVC框架则提供了一种模型驱动的Web开发方式,使得代码结构更加清晰,有利于测试驱动开发。 在Windows Server 2012 R2操作系统中,.NET Framework 3.5可能默认未启用,安装SQL Server 2005时可能需要这个...
5. **宿主环境**:讨论了如何在不同环境中(如ASP.NET、Windows服务、桌面应用等)宿主和使用WF工作流,以及如何自定义宿主环境以满足特定需求。 6. **设计时体验**:涵盖了使用Visual Studio 2008的设计工具来创建...
6. **ASP.NET MVC 3**:虽然压缩包中没有明确提及,但.NET 4.0的发布伴随着ASP.NET MVC 3的推出,为Web应用开发带来了更多功能和灵活性。 总的来说,"Microsoft.NET4.0.rar"包含了运行和开发基于.NET Framework 4.0...
书中介绍了c#的各种语言构造、.net 2.0的类、核心api、公共中间语言(cil)、动态程序集和asp.net扩展等内容;同时也介绍了.net 3.0和.net 3.5中新的编程api,包括wpf 、wcf和wf 的功能;另外,还介绍了最新的c# 3.0...
在Asp.net方面,.NET Framework 4.0引入了ASP.NET MVC(Model-View-Controller)框架,这是一种设计模式,有助于实现更清晰的代码结构和更好的测试性。此外,ASP.NET Dynamic Data框架简化了数据库驱动的应用程序...
7. **MVC(Model-View-Controller)**:.NET Framework 4包含了ASP.NET MVC框架,这是一种用于构建可维护性和测试性更强的Web应用程序的设计模式。 8. **ADO.NET Entity Framework**:数据库访问框架也进行了升级,...
在"压缩包子文件的文件名称列表"中提到了"All-In-One Code Framework",这可能是一个集合多种示例代码和解决方案的框架,它为开发者提供了大量可复用的代码片段,涵盖了各种.NET技术,比如ASP.NET MVC、WPF、WF、WCF...
7. **beginning-asp-net-3-5-in-c-sharp-2008-from-novice-to-professional-second-edition.jpg**:ASP.NET 3.5是.NET Framework 3.0的扩展,这本书可能覆盖了从入门到精通ASP.NET 3.5和C# 2008的全过程。...
5. **ASP.NET**: ASP.NET是用于构建Web应用程序的技术,包括HTTP处理,视图渲染,路由,依赖注入等。通过查看源码,开发者可以更好地理解MVC模式在.NET中的实现,以及如何优化Web应用性能。 6. **ADO.NET**: ADO...
7. **ASP.NET**:是.NET Framework的一部分,用于开发Web应用程序,提供了多种模式(MVC、Web Forms、Web API等)来构建Web应用。 8. **.NET Core**:作为.NET Framework的现代替代品,.NET Core是跨平台的,支持...
4. **宿主环境**:应用程序可以作为WF的宿主,如ASP.NET、Windows服务或自定义宿主。 5. **规则引擎**:支持条件和决策逻辑的表达,可以通过声明式规则来控制流程。 **USING WINDOWS WORKFLOW FOUNDATION** 开发...