我目前正在处理一个系统,我必须并行跟踪数千个对象的状态,这些对象每分钟发送几次可能的状态更新。此外,我必须执行额外的计算(没有慢 IO 的东西,只使用 CPU)。
我目前使用自定义状态机实现。但是,由于 WF 在系统的其他部分中使用,我想知道 WF 状态机是否适用于具有少数(<5)状态的场景。
我担心在性能方面开销可能太大。由于 MS 文档并没有真正涵盖有关 WF 状态机性能的主题,我想知道一些 SO 成员是否有一些关于 WF 状态机性能的信息或资源?
关于 j。
我目前正在处理一个系统,我必须并行跟踪数千个对象的状态,这些对象每分钟发送几次可能的状态更新。此外,我必须执行额外的计算(没有慢 IO 的东西,只使用 CPU)。
我目前使用自定义状态机实现。但是,由于 WF 在系统的其他部分中使用,我想知道 WF 状态机是否适用于具有少数(<5)状态的场景。
我担心在性能方面开销可能太大。由于 MS 文档并没有真正涵盖有关 WF 状态机性能的主题,我想知道一些 SO 成员是否有一些关于 WF 状态机性能的信息或资源?
关于 j。
状态机非常适合高性能系统。如果你真的需要非常高的性能,使用工作流基础会增加很多复杂性和开销。我发现 biztalk 完全不适合非常高的性能。
如果您正在寻找基于 .Net 的高性能状态机,我会推荐Stateless。以下是项目网站的摘录:
支持大多数标准状态机结构:
还提供了一些有用的扩展:
配置如下:
var phoneCall = new StateMachine<State, Trigger>(State.OffHook);
phoneCall.Configure(State.OffHook)
.Permit(Trigger.CallDialed, State.Ringing);
phoneCall.Configure(State.Ringing)
.Permit(Trigger.HungUp, State.OffHook)
.Permit(Trigger.CallConnected, State.Connected);
phoneCall.Configure(State.Connected)
.OnEntry(() => StartCallTimer())
.OnExit(() => StopCallTimer())
.Permit(Trigger.LeftMessage, State.OffHook)
.Permit(Trigger.HungUp, State.OffHook)
.Permit(Trigger.PlacedOnHold, State.OnHold);
// ...
phoneCall.Fire(Trigger.CallDialled);
Assert.AreEqual(State.Ringing, phoneCall.State);
好消息是,由于它实现了泛型,您可以使用 int 或 string 来表示状态和触发器,从而使您可以非常轻松地与数据库或 ORM 集成。美妙之处在于,您无需担心额外的运行时主机,只需从对象或记录中加载具有当前状态的状态机即可。
Microsoft 目前正在其服务器产品中使用 WF,并且他们正在对此进行扩展。例如,WF 引擎可以在 Share Point Server (MOSS) 和 BizTalk Server 中找到。两者都可以很好地扩展并允许扩展场景 - 即,如果您需要更多计算能力,您可以在负载平衡集群中添加更多(便宜)硬件。
HTH,托马斯
这并不直接涉及性能,但如果您计划最终迁移到 WF 4.0,您应该知道 StateMachineActivity 可能不会成功。