我正在C#
中编写一个基本的模拟,从概念上讲,将其设计为多个计时器可以触发事件,这是最简单的,该计时器以大约从半秒到几秒的各种间隔触发事件。我已经使用System.Timers.Timer
进行了草稿设计,效果很好。
但是,这只是一个模拟,所以我不想等待!有没有一种方法可以立即触发下一个将触发的Timer
?
或者这可能是错误的方法,我应该像explained here那样做一些手动操作(迭代Dictionary
的延迟)吗?这样的模拟是否有更好的模式?
答案 0 :(得分:2)
一种解决方法是使用SortedList
待处理事件(按“到期日”排序),并使用触发频率足以满足您所需时间间隔的计时器(例如,每250ms一次就足够了)。
每次(单个)计时器触发时,它都会不断检查列表的最前面,如果最前面的项目具有过去的到期日期,那么我们将使该项目出队并安排其运行(是否您在计时器线程本身上运行事件,或例如启动新的Task
来执行事件,在某种程度上取决于事件是否需要并行发生以及事件处理需要多长时间。
通常,每个事件对象的结构中都将嵌入某种Action
,因此此调度代码可以非常简单。重复发生的事件可能会将它们的“下一个”执行作为其自己的动作的一部分,或者您可以选择使计时器线程采取另一种形式的动作。 (如果您正在执行并行执行,则第二个模型通常会更好地工作,因为它只是与事件队列交互的计时器线程,因此不需要锁定。)
最后,您如何更频繁地运行事情?完全抛弃计时器,然后连续地从队列中取出项目,忽略其到期日期。