WinFX 工作流:使用 Windows Workflow Foundation 的声明性模型简化开

72、Windows工作流基础:构建高效的工作流应用程序 本文详细介绍了 Windows Workflow Foundation (WF) 的核心概念和使用方法,涵盖创建工作流、执行与调试工作流、持久化管理、自定义活动、与其他 .NET 技术集成、性能优化以及安全性实现等内容。通过实际示例和最佳实践,帮助开发者构建高效、灵活的工作流应用程序。 阅读详情

WinFX 工作流:使用 Windows Workflow Foundation 的声明性模型简化开

 

发布日期: 2006-3-29 | 更新日期: 2006-3-29

Don Box和 Dharma Shukla

本文基于 WinFX 的预发布版本。文中包含的所有信息均有可能变更。

本文讨论:

•

Windows Workflow Foundation

•

工作流中的内容

•

复合活动和执行

•

上下文和状态管理

本文使用以下技术:
WinFX、XAML、C# 和 Visual Studio 2005

*
本页内容
工作流 101工作流 101
工作流内部工作流内部
复合活动复合活动
活动执行内部活动执行内部
正常活动执行正常活动执行
上下文和状态管理上下文和状态管理
我们所处的位置我们所处的位置

WinFX 包括一项名为 Windows Workflow Foundation 的技术,该技术使程序可以表示为声明性的、长期运行的过程,这些过程被称作工作流。与传统的 Microsoft® .NET Framework 程序不同,基于工作流的程序通常在声明性的可扩展应用程序标记语言(Extensible Application Markup Language,XAML)文档中指定,该文档根据特定于域的活动指定程序的结构。这些活动通常在传统的基于公共语言运行库 (CLR) 的编程语言(如 C# 或 Visual Basic®)中实现。

WinFX® 提供了一组涵盖了大部分控制流构造的通用活动,不过用户完全可以忽略它们,再编写一整套新的活动,使之准确地适用于要解决的问题域。更常见的情况是,工作流程序将 WinFX 提供的活动用于基本的控制流和程序结构,并且将自定义的用户定义的活动用于特定于域的功能。

除了支持用基于 XAML 的复合方法创建程序之外,基于工作流的程序还获益于一组更丰富的运行时服务,而不是从传统的基于 CLR 的程序中获益。WinFX 工作流运行库可以寄宿在任何 CLR AppDomain 中。运行库允许从内存中删除工作流(一种被称为钝化的技术)并在以后重新加载和恢复,无需开发人员编写明确的状态管理逻辑。工作流运行库还提供用于处理错误以及补偿事务的通用工具,以允许将自动或自定义的撤消逻辑指定用于长期运行的工作单元。此外,您还可以利用管理服务,它们允许通过事件、跟踪或查询工作流状态来检查给定工作流程序的状态。

工作流 101


在 WinFX 中,工作流可以使用声明性 XAML 或任何使用针对 .NET 的语言的命令性代码来表示。使用 XAML 使得在可视化设计器中开发和修改工作流无需传统的 C# 或 Visual Basic 代码。工作流可以完全用 XAML 定义,或者使用 XAML 以及一个包含 C# 或 Visual Basic 代码的代码隐藏文件定义。纯 XAML 工作流可以直接在运行时加载,而无需单独的编译步骤,因此具有优势。为了证明这一点,在本文中需要的位置我会使用 XAML。在所有示例中,我们提供的 XAML 都可以用 C# 或 Visual Basic 表示,尽管这样会更加冗长。

创建一个工作流程序也就是产生该程序的正确 XML 描述。对于某一类用户而言,在文本编辑器中创建并编辑 XML 是一种合适的(有时是理想的)解决方案。对于大部分更喜欢可视化设计器的用户而言,WinFX 包括一个可视化工作流设计器,它可以嵌入到任何基于 Windows 的应用程序中(如图 1 所示)。再强调一次,出于说明的目的,本文以基础 XAML 窗体的形式显示工作流程序,但在所有示例中,都可以使用工作流设计器创建和编辑 XAML。

要允许开发人员使用 C# 或 Visual Basic 创建并编辑工作流,工作流设计器可以在 Visual Studio® 2005 中使用,包括与 Visual Studio 项目系统和调试器集成。与 Visual Studio 调试器集成使您可以使用熟悉的 F5/F10/F11 键绑定,在单个调试会话中调试工作流可视化和底层 C# 或 Visual Basic 代码(如图 2 所示)。

工作流内部


基本上,工作流是一个特定于域的程序语句(称之为活动)树。活动的概念是工作流体系结构的核心 — 您应该将活动视为特定于域的操作码,将工作流视为根据这些操作码编写的程序。

WinFX 提供了一系列可以广泛应用的活动,本文讨论其中的一部分。WinFX 还允许您用 XAML 或与 CLR 兼容的语言编写自己的特定于域的活动。WinFX 活动只是从 System.Workflow.ComponentModel.Activity 派生(直接或间接)的一个 CLR 类型。例如,以下 C# 代码定义一个工作(但无用)的 WinFX 活动:

using System;
using System.Workflow.ComponentModel;

// bind an XML namespace to our CLR namespace for XAML
[assembly: XmlnsDefinition(
    "http://schemas.example.org/MyStuff", "MyStuff.Activities")]
namespace MyStuff.Activities 
{
    public class NoOp : Activity {}
}

要使用该活动,可以用 XAML 编写一个简单的工作流,如以下代码行所示:

<my:NoOp xmlns:my="http://schemas.example.org/MyStuff" />

该工作流由只包含一个活动的树组成。由于我们的活动不执行任何操作,因此我们加载或运行该工作流时不会发生任何事情。更准确地说,工作流运行库加载活动树,并调用根活动上的 Execute 方法。因为该活动没有重写 Execute 方法,所以不发生任何事情。

要更好地处理基于工作流的程序的运行方式,可以定义一个较为有趣的活动,如图 3 所示。该活动有两个明显的特征。其一,它定义了一个名为 Text 的公共属性,该属性可以在基于 XAML 的工作流中初始化。更重要的是,它重写了 Execute 虚方法,并通过向控制台打印 Text 属性进行响应。该活动就绪后,我们就可以编写执行某些任务的工作流了:

<my:WriteLine Text="Hello, world from WinFX."
    xmlns:my="http://schemas.example.org/MyStuff"
/>

该代码运行后,工作流程序打印出字符串“Hello, world from WinFX.”

与所有工作流程序一样,前面的工作流未指定运行环境。相反,是由宿主环境来决定(例如,SharePoint®、ASP.NET、自定义应用程序服务器或 Windows® 外壳程序)加载并运行工作流。工作流运行库在任何环境中都是可嵌入的。运行库通过 System.Workflow.Runtime.WorkflowRuntime 类向宿主环境公开。导致工作流激活的是一个两阶段过程:首先,实例化 WorkflowRuntime 并调用 CreateWorkflow 方法,将 XAML 定义作为 XML 传递,或者传递编译的活动类型,从而在内存中加载程序。WorkflowRuntime.CreateWorkflow 返回一个 WorkflowInstance 类型的对象,它是内存中工作流程序实例的句柄。接下来,为了开始实际的工作流执行,只需调用 WorkflowInstance.Start。以下代码显示如何承载工作流运行库,并从其 XAML 定义运行工作流:

// create and start an instance of the workflow runtime
WorkflowRuntime runtime = new WorkflowRuntime();
runtime.StartRuntime();
// get an XML reader to the XAML-based workflow definition
XmlReader xaml = XmlTextReader.Create("myworkflow.xaml");
// create a running instance of our workflow
WorkflowInstance instance = runtime.CreateWorkflow(xaml); 
instance.Start();

WorkflowInstance.Start 调用创建运行工作流所需的初始数据结构,然后向宿主环境返回控件。工作流表示的实际工作将由运行库使用主机提供的线程或 CLR 线程池进行异步安排。

复合活动


前面显示的 WriteLine 活动是原子活动的一个示例,即该活动将其所有执行逻辑作为不透明代码包含。WinFX 工作流编程模型还支持复合活动的概念,它是根据一个或多个子活动实现其执行逻辑的活动。复合活动从 CompositeActivity 类派生,并且有一个很有名的属性 (Activities),该属性包含了一些子活动。在 XAML 中,这些子活动表示为复合活动的子元素。

WinFX 包括一组简化工作流生成的常用复合活动。我们要研究的第一个活动是 SequenceActivity,如下所示:

<SequenceActivity 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow"
xmlns:my="http://schemas.example.org/MyStuff"
>
    <my:WriteLine Text="One"/>
    <my:WriteLine Text="Two"/>
    <my:WriteLine Text="Three"/>
    <my:WriteLine Text="Four"/>
</SequenceActivity> 

运行时,该工作流编写以下控制台输出:

One
Two
Three
Four

SequenceActivity 依次执行每个子活动。为了支持条件执行,WinFX 为名为 IfElseActivity 的条件执行提供了一个活动。

IfElseActivity 包含一个或多个子活动,每个子活动将一个布尔表达式绑定到一系列活动,当且仅当该布尔表达式值为 true 时执行这些活动。图 4显示一个使用 IfElseActivity 的简单示例。

该代码对应于图 5 中所示的可视化设计器视图。请注意,该 XAML 文件使用 x:Class 属性来表示文件正在定义一个新类型 (MyNamespace.MyWorkflow),而不是现有类型的一个实例。使用 x:Class 使我们拥有了一个包含 C# 或 Visual Basic 代码的代码隐藏文件,如图 4所示。


图 5 MyWorkflow.xaml 的可视化表示


在本示例中,我们定义了两个条件表达式(Is05 和 Is06),它们由工作流定义引用,将标准的 XAML 符号用于基于符号名编写方法。

IfElseActivity 的语义很简单。每个子 IfElseBranchActivity 有一个条件表达式,该表达式的值决定执行哪个分支。条件表达式的值为 true 的第一个IfElseBranchActivity 将获得运行。如果条件表达式的值都不为 true,则选择没有条件的最后一个分支(这就是本例中工作流的情况)。上面显示的工作流等同于以下 C# 代码:

if (DateTime.Now.Year == 2005) Console.WriteLine("Circa-Whidbey");
else if (DateTime.Now.Year == 2006) Console.WriteLine("Circa-Vista");
else Console.WriteLine("Unknown era");

尽管基于工作流版本的程序更加冗长,但也更透明、更易于更改(尤其是对于不使用 C# 的程序员),并且可以利用工作流运行库的服务,如程序挂起、脱水和补偿。

使用 IfElseActivity 的工作流示例将 CodeConditions 用于其布尔表达式。表达式还可以用纯 XAML 编写,无需依赖单独的代码隐藏文件(语法细节超出了本文的讨论范围)。使用基于 XAML 的表达式使工作流中使用的条件可以用声明性格式表示,该格式适用于可视化设计器,但不适用于特定于给定编程语言的单独的文本代码编辑器。

除排序和条件外,WinFX 还包括为迭代建模的活动:WhileActivity。与 IfElseBranchActivity 一样,WhileActivity 有一个 Condition 属性和一组子活动。图 6 显示一个将 WhileActivity 以及代码隐藏文件用于该活动的简单工作流。

通过使用该代码,工作流将打印十遍“Hello, WinFX”消息。请注意,我们在该示例中使用了 WinFX 提供的 CodeActivity,以使底层 IncrementCounter 方法在 while 循环体的结尾处执行。

除了模仿传统命令式编程语言的三种基本复合活动以外,WinFX 还提供了一些更特殊的活动,这些活动支持向前链接的规则赋值、事件-条件-活动 (ECA) 工作流,以及并行。后者使用 WinFX ParallelActivity 表达最为直接。考虑以下 XAML 片断,它创建了执行的两个并行分支:

<ParallelActivity 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow"
xmlns:my="http://schemas.example.org/MyStuff"
> 
    <SequenceActivity> 
        <my:WriteLine Text="One"/> 
        <my:WriteLine Text="Two"/> 
    </SequenceActivity> 
    <SequenceActivity>
        <my:WriteLine Text="Three"/>
        <my:WriteLine Text="Four"/>
    </SequenceActivity>
</ParallelActivity> 

运行时,两个顺序分支计划以并行方式运行,ParallelActivity 的执行逻辑决定其顺序。有了该 XAML,以下输出即为合法的:

One
Three
Two
Four

以下也为合法输出:

Three
One
Four
Two

ParallelActivity 不保证分支之间准确的执行顺序。但是,直到所有分支都执行完成后,ParallelActivity 才能结束。这意味着,给定图 7 中所示的 XAML 片断,输出的第一行始终为“Zero”,第六行也就是最后一行输出始终为“Five”。干预输出也是不确定的。

活动执行内部


Windows Workflow Foundation 的一个主要体系结构原则是,特定的程序语义始终是单个活动的责任,决非工作流运行库的责任。该体系结构希望开发人员和域专家定义适用于给定应用程序域的自定义活动。要保证特定于域的语义在运行库外,活动以及工作流运行库要通过定义完备的协定进行通信,该协定使用 Activity 基类上的虚方法表示。对于任何作为 WinFX 的一部分提供的活动而言,工作流运行库将其与您创建的活动同等对待。事实上,工作流运行库使用相同的协定与 SequenceActivity 以及自定义活动(如本文使用的 WriteLine 活动)进行交互。

要了解活动与运行库的相关方式,我们看一下每个活动必须实现的状态机。该状态机由 ActivityExecutionStatus 枚举反映,如图 8 所示。此外,Activity 基类还公开了发生转换时引发每个状态的 CLR 事件。


图 8 活动状态机


每个活动其实就是其生命周期中任何给定时刻的六个状态之一 — 初始化、执行、取消、故障、补偿以及关闭。虚线转换表示最终转换到关闭状态,在该状态之后,活动将不再进一步转换。通常情况下,活动状态转换会直接受工作流运行库的影响,或受请求工作流运行库计划其子级转换的父活动的影响。在这两种情况下,工作流运行库配合(或强制)活动从一个状态转换到另一个状态。

工作流运行库和活动之间的协定根据 Activity 基类上以下受保护的虚方法表示:

void Initialize(IServiceProvider provider)
ActivityExecutionStatus Execute(ActivityExecutionContext aec)
ActivityExecutionStatus HandleFault(ActivityExecutionContext aec)
ActivityExecutionStatus Cancel(ActivityExecutionContext aec)

此外,作为工作流运行库活动协定的一部分,可补偿的活动需要实现具有 Compensate 方法的 ICompensatableActivity:

namespace System.Workflow.ComponentModel {
    public interface ICompensatableActivity {
       ActivityExecutionStatus.Compensate(ActivityExecutionContextaec)
    }
}

除 Initialize 方法(主机第一次启动工作流时同步调用该方法)之外,所有方法都返回当其将控件返回给运行库时活动的状态。对于可以快速同步执行的操作而言,活动将返回下一个状态(通常为关闭)的枚举值:

protected override ActivityExecutionStatus Execute(
    ActivityExecutionContext aec) 
{
    DoWorkSynchronously();
    // indicate that we're now in the Closed state
    return ActivityExecutionStatus.Closed;
}

相反,排入异步工作队列中的活动必须表明它们仍在执行:

protected override ActivityExecutionStatus Execute(
    ActivityExecutionContext aec) 
{
    EnqueueAsynchronousWork();
    // indicate that we're still executing
    return ActivityExecutionStatus.Executing;
}

然后,活动负责通知运行库何时转换到关闭状态。这通常是为了响应运行库本身引发的某个事件:

// Activity's event handler that is registered with the runtime
void LastStageOfAsyncWork(object sender, EventArgs e) 
{
    // grab a reference to the runtime
    ActivityExecutionContext aec = (ActivityExecutionContext)sender;
    // inform the runtime that we're now 
    // closed
    aec.CloseActivity();
}

该事件处理程序演示了活动开发的一个重要方面。运行库每次调用活动时,它都提供对 ActivityExecutionContext 类型本身的引用。该引用是唯一一个用于所使用活动的运行库的 API。更重要的是,传递给您的引用仅在执行 CLR 方法时有效。一旦您的方法将控件返回给运行库,该上下文引用就不再有效。如果您为了将来使用而错误地在域中缓存了引用,运行库将强制其引发异常。

尽管运行库/活动协定本身具有异步性,但运行库决不会并发调用给定的活动。并且,确保任何给定的活动在指定时刻最多执行一个方法调用。这极大地简化了用 C# 或 Visual Basic 这样的语言编写活动的任务。

正常活动执行


在正常情况下,一个活动经历了两次转换:从初始化到执行,以及从执行到关闭。当工作流运行库能够聚合执行活动所需的资源以及计划活动上的 Execute 方法时,发生第一个转换(从初始化到执行)。如果活动的 Execute 方法返回 ActivityExecutionStatus.Closed,则同步发生第二个转换(从执行到关闭);如果Execute 方法返回 ActivityExecutionStatus.Executing,则在活动上的后续事件处理程序运行并调用 ActivityExecutionContext.CloseActivity 以将状态转换传递给运行库时,将异步发生第二个转换。

复合活动的 Execute 方法通常要求工作流运行库计划其子活动的执行,并且支持异步更改子活动的状态。然后,该活动至少在它的一个子活动处于执行状态时仍保持执行状态。

要更好地了解正常活动执行协议,我们可以看看 SequenceActivity 的实现。为简单起见,我们只关注活动的正常执行路径(初始化到执行再到关闭),这样只需研究 Execute 方法。

在 Execute 方法的实现中,SequenceActivity 同意它第一个子活动的关闭事件,并且请求工作流运行库计划它第一个子活动的执行,方法是调用运行时上下文上的 ExecuteActivity 方法,如图 9 所示。

对 ExecuteActivity 的调用使得计划程序使用标准的初始化-执行-关闭顺序运行该子活动。计划了该子活动后,工作流运行库将使子活动处于执行状态,并且调用子活动的 Execute 方法。最后,当子活动进入关闭状态时,Closed 事件的事件处理程序 (SequenceActivity.OnChildClosed) 将由运行库调用,同时传递一个新的 ActivityExecutionContext 作为第一个参数。图 10 显示 SequenceActivity 的事件处理程序定义。

在该事件处理程序中,我们检查是否有剩余的子活动。如果有,我们使用与前面完成例程相同的事件处理程序方法来计划下一个子活动。如果没有其他的子活动要运行,我们通过调用 CloseActivity 方法来通知运行库已准备转换到关闭状态。

上下文和状态管理


细心的读者会注意到,活动通过 ActivityExecutionContext (AEC) 与运行库进行交互。从概念上看,AEC 作为为一个连续的执行环境,活动在其中执行,活动的对象状态自动在该环境中得到管理。工作流运行库允许活动在正常活动执行期间创建新的持续执行环境。需要其子活动执行多次的活动需要为每次执行创建新的 AEC。WhileActivity 是有关此主题的一个规范示例,它模仿了标准的 C while 循环。

图 11 显示为 WhileActivity 的每个迭代生成的多个 AEC。假设程序中的 WhileActivity 迭代三次,则 WhileActivity 中的三个 SequenceActivity 实例在不同的 AEC 中动态执行,每个实例具有自己的状态。通过赋予 while 循环的每个迭代它自己的 AEC,运行库能够在运行补偿逻辑时撤消每个迭代的执行。


图 11 为迭代生成的活动执行上下文


工作流可以长时间运行。在任何给定的时刻,工作流实例都可以被认为是空闲的,这意味着运行库针对工作流的任何活动都没有可运行的工作。当工作流实例空闲时,其状态可以序列化为主机提供的存储,并且可以从内存中删除。该过程被称作钝化 (passivation)。工作流实例的序列化状态可以用来重新激活内存中的实例,此时实例恢复其状态并且可以执行任务。重新激活通常发生在主机检测到新的可用工作时,方法通常是注意到外部事件的发生。

考虑以下简单的工作流程序,它使用内置的 DelayActivity 使得工作流在序列中间处于空闲状态:

<SequenceActivity
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="http://schemas.example.org/MyStuff"
>
    <my:WriteLine Text="One"/>
    <my:WriteLine Text="Two"/>
    <DelayActivity TimeoutDuration="00:10:00" />
    <my:WriteLine Text="Three"/>
    <my:WriteLine Text="Four"/>
</SequenceActivity> 

在这些代码片断中,当 DelayActivity 执行时,它设置一个计时器订阅并返回 ActivityExecutionStatus.Executing。此时,工作流实例没有可运行的工作,因此被认为是空闲的。在空闲时,工作流运行库将试图使用主机提供的持续服务来保持工作流实例的状态。初始化运行库时,宿主环境可以提供抽象 WorkflowPersistenceService 类型的的实现。如果宿主提供了该类型的一个具体实现(通过 WorkflowRuntime.AddService 方法),则运行库将调用主机的 SaveWorkflowInstanceState 方法,假定主机有机会将状态保存到持续存储中。每个工作流实例由唯一的运行库生成的 GUID 识别,存储使用它来识别实例的持续状态以供将来检索。

运行库在空闲时保存工作流实例以提高可靠性。默认情况下,将实例保存在内存中。主机可以将工作流实例从内存中删除,方法是将运行时范围的 UnloadOnIdle 属性设置为 true,或者对指定实例调用 WorkflowInstance.Unload 方法。通过在运行库上注册 WorkflowIdled 事件,主机可以检测到实例何时空闲,如下所示:

WorkflowRuntime runtime = new WorkflowRuntime();
runtime.StartRuntime();
runtime.WorkflowIdled += delegate(object s, WorkflowEventArgs e)

{ 
...
};

要强制已保存的工作流从主机的持续服务重新加载到内存中,可以调用 WorkflowRuntime.GetWorkflow 方法,传入实例唯一的 GUID。

我们所处的位置


对于 Windows Workflow Foundation 提供的丰富的工作流编程模型和功能,我们仅仅触及到了皮毛。Windows Workflow Foundation 提供了一种根据活动声明性地、更自然地表达应用程序语义的方式,包括程序控制流、事务、并发、同步、异常处理,以及与其他应用程序交互。除了那些在基础 CLR 中可用的服务之外,它还提供了一组丰富的服务,包括原子程序持久性、补偿事务,以及程序状态的运行时检查。工作流运行库可以寄宿在任何 CLR 应用程序域中,因此可以嵌入到任何应用程序或应用程序容器中。您可以从 Windows Vista and WinFX Beta 下载 WinFX 测试版,并且现在开始编写活动。

Don Box 是 Microsoft 互连系统部门的一名架构师,他致力于编程模型和深入研究以支持生成与其他程序通信的程序。在加入 Microsoft 之前,Don 领导了一小批来自多个国家的 IUnknown 崇拜者。您可以访问 www.pluralsight.com/blogs/dbox 以获得有关 Don 的信息。

Dharma Shukla 在 Microsoft 是 Windows Workflow Foundation 小组的首席开发人员,他负责工作流编程模型以及开发人员工具。他现在还在编写一本有关 Windows 工作流的书籍。您可以访问 www.dharmashukla.com 以获得有关 Dharma 的信息。

通过Windows Workflow Foundation 构建企业级工作流应用实战指南 本文还有配套的精品资源,点击获取 简介:本系列教程深入讲解了如何使用Windows Workflow Foundation (WF)构建和开发工作流应用程序。作为.NET Framework的一部分,WF为开发者提供了强大的工具,用于创建规则和状态驱动的业务流程应用。教程涵盖工作流基础概念、设计工具、活动库的使用、工作流持久化、服务集成、监控管理以及版本控制等关键知识点,旨... 阅读详情

相关推荐

深入理解VS2010 Windows Workflow Foundation

Windows Workflow Foundation(WF)是.NET框架中的一个子系统,它允许开发者通过可视化的方式设计、实现、运行和管理业务逻辑和工作流。WF极大地简化了业务流程的管理,使开发者能够专注于业务逻辑的实现,而不必从头开始编写复杂的业务逻辑代码。工作流模型是对实际业务流程的抽象和简化,它将复杂的业务操作流程转化为计算机可以识别的逻辑结构。在一个工作流模型中,通常包含以下基本元素:活动(Activities):表示业务流程中的一个步骤,如任务执行、决策判断、数据处理等。

weixin_35639680的博客 1172

Windows Workflow Foundation(WWF)介绍

Windows Workflow Foundation:支持基于工作流的应用程序 工作流是一个简单思路:按照特定顺序执行的一系列步骤。您甚至可以认为每个应用程序都在执行工作流,因为每个应用程序都执行某些过程。但是,在使用 C#、Visual Basic 或其他编程语言等传统方法开发的应用程序中,这些过程都隐含在代码中。这样做没问题,但是这些过程被深深地嵌入程序逻辑中,使得其执行或更改愈加困难。...

weixin_33965305的博客 395

Windows Workflow Foundation 高级编程源代码探究

本文还有配套的精品资源,点击获取 简介:Windows Workflow Foundation(WF)是.NET Framework的一部分,支持构建、管理和重用工作流逻辑,适用于企业级应用。本资源提供深入学习WF的源代码示例,涵盖了WF架构、活动构建、持久化、设计器、服务集成、版本控制、状态管理、规则引擎、自定义活动开发及错误处理等高级特性。开发者可以利用这些源代码深入理...

weixin_33670640的博客 2166

Windows Workflow技术

 Windows Workflow技术 1     概念... 22     Windows Workflow.. 42.1      .Net Framework 3.0 简介... 42.2      Windows Workflow Foundation简介... 53     开发环境搭建... 54     Workflow模型... 64.1    

shhzj的专栏 4310

Windows Workflow Foundation 4实用解决方案大全

本文还有配套的精品资源,点击获取 简介:WF4 Cookbook是针对.NET Framework 4中WF4技术的详尽指南,包含大量实例和解决方案,适用于开发者和系统架构师。WF4作为WF框架的升级,通过工作流基础、设计模式、持久化机制、规则引擎、工作流服务、表达式和变量支持、调试跟踪、版本控制、自定义宿主及工作流设计器等特性,增强了工作流应用程序的灵活性、可维护性和性能...

weixin_42497762的博客 578

微软工作流组件简介-Windows Workflow Foudation

微软推出的工作流引擎:Windows Workflow Foudation,简单介绍一下。 这个开发环境需要安装在vs2005里面。 可以选择你的workflow引擎的Host 他处理的主要有两类工作流:顺序工作流(Sequential Workflow )和状态机工作流(State Machine Workflow )

Microsoft Windows Workflow Foundation 入门:开发人员演练

show toc 欢迎来到 MSDN > Windows 开发 Microsoft Windows Workflow Foundation 入门:开发人员演练 发布日期: 11/30/2005 | 更新日期: 11/30/2005 Dino EspositoSolid Quality Learning 适用于:Microsoft Windows Workflow...

weixin_30401605的博客 494

AutoCAD矢量数据导出全攻略:GIS4CAD插件一键转shp/mdb/kml(附安装包)

本文详细介绍了GIS4CAD插件如何高效解决AutoCAD矢量数据向GIS格式转换的难题。通过一键操作,用户可将CAD中的规划图、地形图等无损转换为行业标准的shp、mdb、kml等多种格式,并确保属性完整与坐标准确。文章提供了从插件安装、数据准备到实战导出的全流程指南,是城市规划、测绘等领域专业人士提升数据互操作效率的必备攻略。

a2b3c4d5e的博客 283

WinFX 工作流:简化Windows Workflow Foundation 的声明性模型开发

本文基于 WinFX 的预发布版本。文中包含的所有信息均有可能变更。本文讨论: •

奥法鱼 1965

微带功分器设计与ADS-EM联合仿真实战解析

本文详细解析了微带功分器设计与ADS-EM联合仿真的实战技巧,涵盖特性阻抗计算、ADS原理图设计、版图生成与EM仿真等关键步骤。通过实际案例分享,帮助工程师掌握射频电路设计中的核心技术和调试方法,提升功分器设计效率与性能。

weixin_29280219的博客 450

常学常新:《Attention Is All You Need》万字解读!

常学常新:《Attention Is All You Need》万字解读!

hunteritself的博客 3644

[WWF]相关资料整理

MSDN文(CN)文档使用 Windows Workflow Foundation 的声明性模型简化开下载资源WinFX Runtime Components 转载于:https://www.cnblogs.com/xuzhong/archive/2006/03/31/363239.html

weixin_30423977的博客 83

Unidbg逆向阿里系App签名:从环境补全到算法还原实战

在移动安全与协议分析领域,理解应用层签名机制是核心挑战之一。签名算法作为保障通信安全与身份验证的关键技术,其原理通常涉及哈希、加密及密钥协商等基础密码学概念。在Android平台,核心签名逻辑常被加固并隐藏于Native层SO库中,以对抗动态调试与静态分析,这为安全研究和协议兼容带来了技术障碍。Unidbg作为一种基于模拟执行的逆向工程工具,通过模拟ARM指令集和系统调用,允许研究者在脱离真机环境的情况下,可控地执行和调试SO文件,为解决此类问题提供了创新思路。其技术价值在于实现了对加固代码的确定性分析与算

weixin_42525738的博客 937

Windows Workflow Foundation(1)- Windows Workflow Foundation 概述

Windows Workflow Foundation(第一章)- Windows Workflow Foundation 概述 工作流概述 活动(Activity)是工作流的基本单元,用于描述实际进程。工作流(workflow)提供了一种方法,用于描述多项短期运行或长期运行的工作之间的执行顺序和依赖关系。此工作从头到尾地贯穿模型,并且活动可以人工执行或由系统功能执行。 工作流运行...

afgvkab3084的博客 1768

基于深度学习的中文方言识别模型训练实战

本文介绍了一个基于深度学习的中文方言识别模型开发流程。项目采用PyTorch框架和Chinese-BERT-wwm预训练模型,构建了包含BERT基础层、方言特征增强层和注意力机制的多方言分类系统。文中详细阐述了数据收集策略,包括从社交媒体、语料库和众包平台获取多源数据,并实现了文本清洗、同义词替换和回译等数据增强技术。模型架构部分展示了如何在BERT基础上添加方言特征提取层和多头注意力机制来提升识别性能。该方案支持普通话、粤语等6种主要方言的识别,目标准确率达90%以上,响应时间小于100ms,适用于智能客

电脑管家 1729

YOLOv8 | 损失函数改进,最新提出的Shape-IoU,有效涨点

作为检测器定位分支的重要组成,边框回归损失在目标检测任务中发挥巨大作用。现有的边框回归方法,通常考虑了GT框与预测框之间的几何关系,通过使用边框间的相对位置与相对形状等计算损失,而忽略了边框其自身的形状与尺度等固有属性对边框回归的影响。为了弥补现有研究的不足,本文提出聚焦边框自身形状与尺度的边框回归方法。首先我们对边框回归特性进行分析,得出边框自身形状因素与尺度因素会对回归结果产生影响。

kay_545 1913

Windows Workflow(VS 2019)

一、启动流程多种方式 方式1 1)调用活动(activity),假设通过新增项新建活动为Activity1,具体工作流程可以在工作流程编辑界面进行编辑。 using System; using System.Linq; using System.Activities; using System.Activities.Statements; namespace WorkflowConsoleApplication2 { class Program { static

会挽雕弓如满月 1388

【大模型】Coze AI 智能体工作流从配置到使用实战详解

Coze 扣子智能体工作流从配置到使用实战详解

congge 1万+

和我一起学Windows Workflow Foundation(微软工作流) (www.jiedichina.com)

南京捷帝 www.jiedichina.com(1)-----创建和调试一个WF实例 今天开始,我打算开始学习WWF,从网上搜索到了部分相关资料,也找到了一些文档和实验。但是,资料以英文的占多数,所以,在学习起来似乎比较吃力,不过相信我能坚持下来,顺便提高点英语阅读能力,不过本人英文水平实在是差,解释的不到位或错误的地方请大家谅解(千万别笑话我,哈哈)。毕竟我也是从空白开始学习WW

老夏课堂-夏曹俊的技术专栏 3126

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

和我一起学Windows Workflow Foundation(1)-----创建和调试一个WF实例

今天开始,我打算开始学习WWF,从网上搜索到了部分相关资料,也找到了一些文档和实验。但是,资料以英文的占多数,所以,在学习起来似乎比较吃力,不过相信我能坚持下来,顺便提高点英语阅读能力,不过本人英文水平实在是差,解释的不到位或错误的地方请大家谅解(千万别笑话我,哈哈)。毕竟我也是从空白开始学习WWF,让我们一起进步。 首先,我们需要安装WinFX(下载)和Visual Studio 2005 e...

weixin_34234829的博客 299

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[转帖]Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流)

Windows Workflow Foundation之旅(二)——指南1(构造一个顺序工作流)翻译自 ms-help://MS.WinWF.v1.EN/WinWF_GettingStarted/html/9c3e5551-4eff-4977-89ac-f81ab092d996.htm  顺序工作流(sequentialworkflow)是为执行一种由一系列预定义的步骤组成的任务而设计的。

soulspark的专栏 1321

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Windows WorkFlow Foundation入门

一、工作流概述工作流是由活动单元组成的集合,活动是真实过程的的一个模型。工作流提供了一种描述一系列相互关联的工作之间有执行顺序,这种工作从头到尾贯穿了整个活动,这些活动可能是由人工或系统来执行。每一个运行的工作流实例由工作流运行时引擎来创建和维护的。虽然对于每一个应用程序域只能有一个工作流运行时引擎,但工作流运行时引擎内可以行多个工作流实例并发工作。一旦一个工作流模型被...

weixin_30335575的博客 280

学习搜狗workflow心路历程(1)Windows版本的环境搭建

1、搜狗workflow的官网源码 https://github.com/sogou/workflow https://gitee.com/mirrors/sogou-cpp-workflow 其中,Windows版本是分支。 2、环境搭建

$firecat利白的代码足迹$ 5336

最先进的技术:Windows Workflow Foundation

下载本文的代码:CuttingEdge0603.exe (663KB)本页内容 常见业务方案 应用 Windows Workflow Foundation

奥法鱼 2155

Windows Workflow Foundation(一)

组织并执行一系列的操作或者活动的最自然的方式——那就是工作流——同时也是构造一个工作流程的可执行表现形式的最佳途径。  Windows Workflow Foundation(以下简称WWF)提供了一个编程框架和工具以开发和执行各种不同的基于工作流的应用程序,比如文档管理、线型的商业应用、贸易单据流程、IT管理、B2B应用以及消费者应用。有状态的、持久化的、不间断运行的应用程序  WWF简

simonezhlx的专栏 1517
上一篇: wse2.0实现webservice安全(转)
下一篇: 先收藏个 WS 常用代码
RayLynn
博客等级 码龄22年 8粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值