Windows Workflow Foundation Statemachines适用于高性能方案吗?

时间:2009-08-19 18:39:50

标签: c# performance workflow-foundation state-machine

我正在处理一个系统,我必须跟踪几千个并行对象的状态,每分钟发送几次可能的状态更新。此外,我必须执行额外的计算(没有缓慢的IO东西,只使用CPU)。

我目前使用自定义状态机实现。然而,由于WF在系统的其他部分中使用,我想知道WF状态机是否适合具有少数(<5)状态的这种情况。

我担心在性能方面,开销可能过大。由于MS文档并未真正涵盖有关WF状态机性能的主题,我想知道某些SO成员是否有某些信息或资源来重新获得WF状态机的性能?

问候 学家

4 个答案:

答案 0 :(得分:5)

状态机非常适合高性能系统。如果你真的需要非常高的性能,使用工作流基础会增加很多复杂性和开销。我发现biztalk完全不适合非常高的性能。

答案 1 :(得分:5)

如果您正在寻找基于.Net的高性能状态机,我建议Stateless。以下是项目网站的摘录:

支持大多数标准状态机构造:

  • 对州和州的一般支持 任何.NET类型的触发器(数字, 字符串,枚举等)
  • 分层状态进入/退出 国家事件
  • Guard条款支持条件 过渡
  • 反思

还提供了一些有用的扩展程序:

  • 能够在外部存储状态 (例如,在追踪的财产中 by Linq to SQL)
  • 参数化触发器
  • 重入状态

配置如下:

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集成。美妙之处在于,您不必担心额外的运行时主机,只需从对象或记录中加载具有当前状态的状态机,您就可以了。

答案 2 :(得分:1)

微软目前正在他们的服务器产品中使用WF,他们正在扩展它。例如,可以在Share Point Server(MOSS)和BizTalk Server中找到WF引擎。两者都可以很好地扩展并允许横向扩展方案 - 例如,如果您需要更多计算能力,则可以在负载平衡群集中添加更多(廉价)硬件。

HTH, 托马斯

答案 3 :(得分:1)

这并不直接与性能有关,但如果您计划最终转移到WF 4.0,您应该知道StateMachineActivity可能won't be making the cut