一个简单的态机模式工作流演示(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 Object, ByVal e As WorkflowCompletedEventArgs)
WaitHandle.Set()
End Sub

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







































工作流的Partial部分(就与NET2中WinForm设计时的Partial部分一样)


























































































































































宿主程序,就是一个控制台程序,在这里运行工作流
添加一入口类,将工程设为控制台输出












































【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构