一个简单的态机模式工作流演示(2)(代码与实现)

工作流的代码
Public class Workflow1
    
Inherits StateMachineWorkflowActivity
    
Public Sub New()
        
MyBase.New()
        InitializeComponent()
    
End Sub


    
Public wxd_state As String = "wxd"
    
Public wxd_i As Integer = 0
    
Private Sub code1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        System.Console.WriteLine(
"开始cood1结点代码")
        wxd_state 
= "123"
        System.Console.WriteLine(
"为wxd_state赋值:123")
        System.Console.WriteLine(
"结束cood1结点代码")
    
End Sub


    
Private Sub code2_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        System.Console.WriteLine(
"开始cood2结点代码")

        System.Console.WriteLine(
"如果wxd_state值为将执行该结点")
        System.Console.WriteLine(wxd_state)
        System.Console.WriteLine(
"结束cood3结点代码")
    
End Sub


 
    
Private Sub code3_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        System.Console.WriteLine(
"开始cood3结点代码")

        System.Console.WriteLine(
"如果wxd_state值不为将执行该结点")
        System.Console.WriteLine(wxd_state)
        System.Console.WriteLine(
"结束cood3结点代码")
    
End Sub


    
Private Sub cood4_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        
Me.wxd_i = wxd_i + 1
        System.Console.WriteLine(wxd_i.ToString())
    
End Sub

End Class


工作流的Partial部分(就与NET2中WinForm设计时的Partial部分一样)
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial 
class Workflow1

    
'NOTE: The following procedure is required by the Workflow Designer
    'It can be modified using the Workflow Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerNonUserCode()> _
    
Private Sub InitializeComponent()
        
Me.CanModifyActivities = True
        
Dim ruleconditionreference1 As System.Workflow.Activities.Rules.RuleConditionReference = New System.Workflow.Activities.Rules.RuleConditionReference
        
Dim ruleconditionreference2 As System.Workflow.Activities.Rules.RuleConditionReference = New System.Workflow.Activities.Rules.RuleConditionReference
        
Me.code3 = New System.Workflow.Activities.CodeActivity
        
Me.code2 = New System.Workflow.Activities.CodeActivity
        
Me.cood4 = New System.Workflow.Activities.CodeActivity
        
Me.ifElseBranchActivity2 = New System.Workflow.Activities.IfElseBranchActivity
        
Me.ifElseBranchActivity1 = New System.Workflow.Activities.IfElseBranchActivity
        
Me.setStateActivity1 = New System.Workflow.Activities.SetStateActivity
        
Me.code1 = New System.Workflow.Activities.CodeActivity
        
Me.delayActivity1 = New System.Workflow.Activities.DelayActivity
        
Me.setStateActivity2 = New System.Workflow.Activities.SetStateActivity
        
Me.whileActivity1 = New System.Workflow.Activities.WhileActivity
        
Me.ifElseActivity1 = New System.Workflow.Activities.IfElseActivity
        
Me.delayActivity2 = New System.Workflow.Activities.DelayActivity
        
Me.eventDrivenActivity1 = New System.Workflow.Activities.EventDrivenActivity
        
Me.eventDrivenActivity2 = New System.Workflow.Activities.EventDrivenActivity
        
Me.wxd_initial = New System.Workflow.Activities.StateActivity
        
Me.wxd_completed = New System.Workflow.Activities.StateActivity
        
Me.wxd_node = New System.Workflow.Activities.StateActivity
        
'
        'code3
        '
        Me.code3.Name = "code3"
        
AddHandler Me.code3.ExecuteCode, AddressOf Me.code3_ExecuteCode
        
'
        'code2
        '
        Me.code2.Name = "code2"
        
AddHandler Me.code2.ExecuteCode, AddressOf Me.code2_ExecuteCode
        
'
        'cood4
        '
        Me.cood4.Name = "cood4"
        
AddHandler Me.cood4.ExecuteCode, AddressOf Me.cood4_ExecuteCode
        
'
        'ifElseBranchActivity2
        '
        Me.ifElseBranchActivity2.Activities.Add(Me.code3)
        
Me.ifElseBranchActivity2.Name = "ifElseBranchActivity2"
        
'
        'ifElseBranchActivity1
        '
        Me.ifElseBranchActivity1.Activities.Add(Me.code2)
        ruleconditionreference1.ConditionName 
= "Condition1"
        
Me.ifElseBranchActivity1.Condition = ruleconditionreference1
        
Me.ifElseBranchActivity1.Name = "ifElseBranchActivity1"
        
'
        'setStateActivity1
        '
        Me.setStateActivity1.Name = "setStateActivity1"
        
Me.setStateActivity1.TargetStateName = "wxd_node"
        
'
        'code1
        '
        Me.code1.Name = "code1"
        
AddHandler Me.code1.ExecuteCode, AddressOf Me.code1_ExecuteCode
        
'
        'delayActivity1
        '
        Me.delayActivity1.Name = "delayActivity1"
        
Me.delayActivity1.TimeoutDuration = System.TimeSpan.Parse("00:00:00")
        
'
        'setStateActivity2
        '
        Me.setStateActivity2.Name = "setStateActivity2"
        
Me.setStateActivity2.TargetStateName = "wxd_completed"
        
'
        'whileActivity1
        '
        Me.whileActivity1.Activities.Add(Me.cood4)
        ruleconditionreference2.ConditionName 
= "Condition2"
        
Me.whileActivity1.Condition = ruleconditionreference2
        
Me.whileActivity1.Name = "whileActivity1"
        
'
        'ifElseActivity1
        '
        Me.ifElseActivity1.Activities.Add(Me.ifElseBranchActivity1)
        
Me.ifElseActivity1.Activities.Add(Me.ifElseBranchActivity2)
        
Me.ifElseActivity1.Name = "ifElseActivity1"
        
'
        'delayActivity2
        '
        Me.delayActivity2.Name = "delayActivity2"
        
Me.delayActivity2.TimeoutDuration = System.TimeSpan.Parse("00:00:00")
        
'
        'eventDrivenActivity1
        '
        Me.eventDrivenActivity1.Activities.Add(Me.delayActivity1)
        
Me.eventDrivenActivity1.Activities.Add(Me.code1)
        
Me.eventDrivenActivity1.Activities.Add(Me.setStateActivity1)
        
Me.eventDrivenActivity1.Name = "eventDrivenActivity1"
        
'
        'eventDrivenActivity2
        '
        Me.eventDrivenActivity2.Activities.Add(Me.delayActivity2)
        
Me.eventDrivenActivity2.Activities.Add(Me.ifElseActivity1)
        
Me.eventDrivenActivity2.Activities.Add(Me.whileActivity1)
        
Me.eventDrivenActivity2.Activities.Add(Me.setStateActivity2)
        
Me.eventDrivenActivity2.Name = "eventDrivenActivity2"
        
'
        'wxd_initial
        '
        Me.wxd_initial.Activities.Add(Me.eventDrivenActivity1)
        
Me.wxd_initial.Name = "wxd_initial"
        
'
        'wxd_completed
        '
        Me.wxd_completed.Name = "wxd_completed"
        
'
        'wxd_node
        '
        Me.wxd_node.Activities.Add(Me.eventDrivenActivity2)
        
Me.wxd_node.Name = "wxd_node"
        
'
        'Workflow1
        '
        Me.Activities.Add(Me.wxd_node)
        
Me.Activities.Add(Me.wxd_completed)
        
Me.Activities.Add(Me.wxd_initial)
        
Me.CompletedStateName = "wxd_completed"
        
Me.DynamicUpdateCondition = Nothing
        
Me.InitialStateName = "wxd_initial"
        
Me.Name = "Workflow1"
        
Me.CanModifyActivities = False

    
End Sub

    
Private WithEvents whileActivity1 As System.Workflow.Activities.WhileActivity
    
Private WithEvents cood4 As System.Workflow.Activities.CodeActivity
    
Private WithEvents setStateActivity2 As System.Workflow.Activities.SetStateActivity
    
Private WithEvents delayActivity2 As System.Workflow.Activities.DelayActivity
    
Private WithEvents ifElseBranchActivity2 As System.Workflow.Activities.IfElseBranchActivity
    
Private WithEvents ifElseBranchActivity1 As System.Workflow.Activities.IfElseBranchActivity
    
Private WithEvents ifElseActivity1 As System.Workflow.Activities.IfElseActivity
    
Private WithEvents code3 As System.Workflow.Activities.CodeActivity
    
Private WithEvents code2 As System.Workflow.Activities.CodeActivity
    
Private WithEvents wxd_completed As System.Workflow.Activities.StateActivity
    
Private WithEvents wxd_node As System.Workflow.Activities.StateActivity
    
Private WithEvents eventDrivenActivity1 As System.Workflow.Activities.EventDrivenActivity
    
Private WithEvents eventDrivenActivity2 As System.Workflow.Activities.EventDrivenActivity
    
Private WithEvents setStateActivity1 As System.Workflow.Activities.SetStateActivity
    
Private WithEvents delayActivity1 As System.Workflow.Activities.DelayActivity
    
Private WithEvents code1 As System.Workflow.Activities.CodeActivity
    
Private WithEvents wxd_initial As System.Workflow.Activities.StateActivity
End Class


宿主程序,就是一个控制台程序,在这里运行工作流

  添加一入口类,将工程设为控制台输出
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Threading
Imports System.Workflow.Runtime
Imports System.Workflow.Runtime.Hosting

Public Class begin

    
Shared WaitHandle As New AutoResetEvent(False)

    
Shared Sub Main()
        Console.WriteLine(
"开始")
        Using workflowRuntime 
As New WorkflowRuntime()

            
'完成时事件
            AddHandler workflowRuntime.WorkflowCompleted, AddressOf OnWorkflowCompleted

            
'出错时事件
            AddHandler workflowRuntime.WorkflowTerminated, AddressOf OnWorkflowTerminated

            
Dim workflowInstance As WorkflowInstance
            workflowInstance 
= workflowRuntime.CreateWorkflow(GetType(Workflow1))

            workflowInstance.Start() 
'开始
            WaitHandle.WaitOne()    '等待,阻塞进程

        
End Using
        Console.WriteLine(
"完成")
        Console.ReadLine()
    
End Sub


    
'完成时事件
    Shared Sub OnWorkflowCompleted(ByVal sender As ObjectByVal e As WorkflowCompletedEventArgs)
        WaitHandle.Set()
    
End Sub


    
'出错时事件
    Shared Sub OnWorkflowTerminated(ByVal sender As ObjectByVal e As WorkflowTerminatedEventArgs)
        Console.WriteLine(e.Exception.Message)
        WaitHandle.Set()
    
End Sub

End Class






posted @ 2006-09-26 22:18  WXWinter(冬)  阅读(8313)  评论(17编辑  收藏  举报