我的场景是一个应用程序在实时数据上循环工作并且截止日期很紧。
我在每个周期对数据采取一系列行动。我有在每个周期发生的动作(让我们用大写字母来称呼它们,比如A、B、C ..)和其他只在每 x 个周期发生的动作(让我们用小写字母来称呼它们,比如d、e、f, ...)。一个流模式示例,有两个持续的动作,一个发生在 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 的一些内容(我目前不知道它是否适合我的情况)和其他解决方案,但我需要知道在花时间理解它之前采取的最佳方向。例如任务更适合这个?或者我应该坚持使用线程并创建一个调度程序类来管理所有可能的情况(在这种情况下,我已经看到关于模式更改的不同问题,如果你能更深入地研究这个问题,我会很高兴)?还是有更好的选择?
[编辑]当循环中的前一个主要动作( A,B,...)终止
时,可以执行动作。次要动作(d,e,...)可以同时执行。例如,在A - B - d - e类型的循环中,动作B只能在A之后执行,动作d只能在B之后执行,动作e只能在B之后执行,也可能与d同时执行。此外,如果我不将两个连续的主要动作分组(在示例中,人们可能会认为A和B由于它们的相互依赖性,可以组合成一个动作)这意味着在两个不同的线程中执行。这样做的原因是我使用循环缓冲区来存储中间结果(在示例中,结果来自A,稍后将由B使用)。缓冲区帮助我在实时过程中不丢失数据,以防由于某种原因在过程中出现延迟(事实上,无论循环中的最后一个动作已经完成或不是)。