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

Joa*_*mer 6 c# performance state-machine workflow-foundation

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

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

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

关于j.

Jay*_*Jay 5

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


Dav*_*ins 5

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

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

  • 对任何.NET类型的状态和触发器的通用支持(数字,字符串,枚举等)
  • 分层状态状态的进入/退出事件
  • Guard子句支持条件转换
  • 内省

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

  • 能够在外部存储状态(例如,在Linq跟踪到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);
Run Code Online (Sandbox Code Playgroud)

好的是,由于它实现了Generics,您可以使用int或string来表示状态和触发器,从而可以非常轻松地与数据库或ORM集成.美妙之处在于,您不必担心额外的运行时主机,只需从对象或记录中加载具有当前状态的状态机,您就可以开始使用了.