我的场景是一个应用程序在实时数据上循环工作,并且有很长的截止日期。
我有一系列行动来处理每个周期的数据。我在每个周期都会采取行动(让我们用大写字母称为 A , B , C ..)和其他行动只发生在每x个周期(让我们用小写字母称为 d , e , f ,......)。一个流程模式示例,具有两个持久性操作,一个持续时间为3个周期,可以是(循环结束时标记为“|”):
A - B - d | A - B | A - B | A - B - d | ...
此外,模式可能会在运行时根据用户的输入而改变。因此可以在列表中添加或删除某些操作。例如,之前的模式是删除 B ,在 A 之后添加 C ,在 C <之后添加 e / strong>周期为2个周期会突然变为(更改周期标记为' - &gt;'):
... | A - B - d | - &GT; 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 ...我有模式改变时出现的死锁问题。我可以修复它们,但我认为有一个更灵活的解决方案会好得多,所以如果我以后需要更改模式,我已经有了所有工具来有效地完成它。
我对这个话题很新,但我认为(也跟我建议的那样previoulsy)我需要一种调度程序。
我已经阅读了一些关于Windows Workflow Foundation(目前我不知道它是否适合我的情况)和其他解决方案的内容,但我需要知道在花时间理解之前要采取的最佳方向。例如,任务更适合这个?或者我应该坚持线程并创建一个Scheduler类来管理所有可能的情况(在这种情况下,我看到已经有不同的模式更改问题,如果你能深入研究这个问题我会很高兴)?还是有更好的选择?
[编辑]
当循环中的上一个主要操作( A , B ,...)终止时,可以执行操作。次要操作( d , e ,...)可以同时执行。例如,类型为 A - B - d - e 行动 B 只能在 A 之后执行, B 仅在 B 后执行 e ,也可能与 d 同时发生。
此外,如果我没有将两个连续的主要行动分组(在示例中,可能会认为 A 和 B 因为它们的相互依赖性可以归为一个单一行动),这意味着在两个不同的线程中执行。这样做的原因是我使用循环缓冲区来存储中间结果(在示例中,结果来自 A ,稍后将由 B 使用)。缓冲区帮助我在实时过程中不丢失数据,以防由于某种原因导致过程延迟(实际上主要的领导者行动 A 将始终以良好的计时准确性发生,无论最后循环中的动作是否已经结束)。
答案 0 :(得分:0)
我建议查看Windows工作流并将委托绑定到状态机状态更改。
您可以跟踪循环次数CycleIteration = cycle ++%MaxCycleCount
并根据哪个迭代触发循环循环。
每个循环迭代都有一个工作流程,所以请调用它:
循环迭代0: A - B - d
循环迭代1: A - B
循环迭代2: A - B
循环迭代3: A - B - d
...
工作流状态机中的每个循环状态更改都基于迭代计数。您的每个单独的方法都会将委托定义为包含在委托中的工作项以供重复使用。
每个Cycle Iteration工作流程都将由FSM保存并调用,如下所示:
CycleIteration1Execute(...){ 马蹄莲(...); callB(...); callD(...); 返回; }
然后,循环次序和循环状态的修改将保持在逻辑上易于维护的小块中。
编辑(提供WF实施示例):
WF有限状态机的示例: 这是一个非常初学者的例子,说明了如何进行2状态FSM。
http://www.codeproject.com/KB/dotnet/FirstStateMachineWorkflow.aspx
M $提供的示例(与所有示例一样,非常冗长,但提供了更多参与示例):
http://msdn.microsoft.com/en-us/magazine/cc163281.aspx
最好的,最后一个使用WF的状态机上的博客文章