3

我的场景是一个应用程序在实时数据上循环工作并且截止日期很紧。

我在每个周期对数据采取一系列行动。我有在每个周期发生的动作(让我们用大写字母来称呼它们,比如ABC ..)和其他只在每 x 个周期发生的动作(让我们用小写字母来称呼它们,比如def, ...)。一个流模式示例,有两个持续的动作,一个发生在 3 个周期的周期可能是(周期结束标记为“|”):

A - B - d | A - B | A - B | A - B - d |...

此外,该模式可以在运行时根据用户的输入而改变。因此可以从列表中添加或删除一些操作。例如,先前的模式通过删除B ,在A之后添加C ,在C之后添加e,周期为 2 个周期,会突然变成(以 '->' 标记的更改周期):

...| A - B - d | -> A - d - C - e | A - C | A - C - e | A - d - C | A - C - e | A - C | A - d - C - e |...

现在我手动启动线程,这些线程通过 WaitHandles 相互通信,如果操作很繁重,请使用 Parallel.For。然后,当模式发生变化时,我可能不得不终止某个线程,启动另一个线程,替换等待的 WaitHandle ......当模式发生变化时,我会出现死锁问题。我可以修复它们,但我想到有一个更灵活的解决方案会更好,这样如果我以后需要更改模式,我已经拥有所有工具来有效地完成它。

我对这个话题很陌生,但我认为(按照之前向我提出的建议我需要一种调度程序。

我已经阅读了有关 Windows Workflow Foundation 的一些内容(我目前不知道它是否适合我的情况)和其他解决方案,但我需要知道在花时间理解它之前采取的最佳方向。例如任务更适合这个?或者我应该坚持使用线程并创建一个调度程序类来管理所有可能的情况(在这种情况下,我已经看到关于模式更改的不同问题,如果你能更深入地研究这个问题,我会很高兴)?还是有更好的选择?

[编辑]当循环中的前一个主要动作( AB,...)终止
时,可以执行动作。次要动作(de,...)可以同时执行。例如,在A - B - d - e类型的循环中,动作B只能在A之后执行,动作d只能在B之后执行,动作e只能在B之后执行,也可能与d同时执行。此外,如果我不将两个连续的主要动作分组(在示例中,人们可能会认为AB由于它们的相互依赖性,可以组合成一个动作)这意味着在两个不同的线程中执行。这样做的原因是我使用循环缓冲区来存储中间结果(在示例中,结果来自A,稍后将由B使用)。缓冲区帮助我在实时过程中不丢失数据,以防由于某种原因在过程中出现延迟(事实上,无论循环中的最后一个动作已经完成不是)。

4

1 回答 1

0

我建议查看 Windows 工作流程并将委托绑定到状态机状态更改。

您可以跟踪循环计数 CycleIteration = cycle++ % MaxCycleCount

并根据哪个迭代触发循环循环。

每个循环迭代都有一个工作流程,所以称之为:

循环迭代 0:A - B - d

循环迭代 1:A - B

循环迭代 2:A - B

循环迭代 3:A - B - d

...

工作流状态机中的每个循环状态更改都基于迭代计数。您的每个单独的方法都将有一个委托,该委托定义为包装在委托中以供重用的工作项。

FSM 将保存和调用每个循环迭代工作流,如下所示:

CycleIteration1Execute(...){ callA(...); 呼叫B(...); 呼叫D(...); 返回; }

然后循环顺序和循环状态的修改将被维护在易于维护的小逻辑块中。

编辑(提供WF实现的示例):

WF 有限状态机示例: 这是一个非常初学者的示例,说明了如何执行 2 状态 FSM。

http://www.codeproject.com/KB/dotnet/FirstStateMachineWorkflow.aspx

M$ 提供的示例(与他们所有的示例一样,非常罗嗦,但给出了更多涉及的示例):

http://msdn.microsoft.com/en-us/magazine/cc163281.aspx

最后最好的是,一篇关于使用 WF 的状态机的非常好的博客文章

http://odetocode.com/code/460.aspx

于 2011-02-25T16:35:28.960 回答