Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无需等待的定时器模拟_C#_Timer_Simulation - Fatal编程技术网

C# 无需等待的定时器模拟

C# 无需等待的定时器模拟,c#,timer,simulation,C#,Timer,Simulation,我正在用C#编写一个基本的模拟,从概念上讲,最简单的方法是将它设计成多个定时器,以大约半秒到几秒的不同间隔触发事件。我已经用System.Timers.Timer做了一个粗略的草案,它运行得很好 然而,这只是一个模拟,所以我不想等待!有没有办法立即触发下一个将触发的计时器 或者这是一种错误的方法,我应该做一些手动操作(迭代字典中的延迟)?这样的模拟有更好的模式吗?一种方法是使用一组挂起事件(按其“到期日”排序),并使用一个触发频率足以满足您希望使用的时间间隔的计时器(例如,这里每250ms一次就

我正在用
C#
编写一个基本的模拟,从概念上讲,最简单的方法是将它设计成多个定时器,以大约半秒到几秒的不同间隔触发事件。我已经用
System.Timers.Timer
做了一个粗略的草案,它运行得很好

然而,这只是一个模拟,所以我不想等待!有没有办法立即触发下一个将触发的
计时器


或者这是一种错误的方法,我应该做一些手动操作(迭代
字典
中的延迟)?这样的模拟有更好的模式吗?

一种方法是使用一组挂起事件(按其“到期日”排序),并使用一个触发频率足以满足您希望使用的时间间隔的计时器(例如,这里每250ms一次就足够了)

每次(单个)计时器启动时,它都会不断检查列表的前面,如果前面的项目在过去有一个到期日期,那么我们将该项目出列并安排它运行(您是在计时器线程本身上运行事件,还是例如启动新的
任务
s来执行它们,在一定程度上取决于事件是否需要并行发生以及事件处理所需的时间)

通常情况下,每个事件对象的结构中都会嵌入某种类型的事件,因此此调度代码非常简单。重复事件可能会将其“下一次”执行作为其自身操作的一部分排队,或者您可以选择由计时器线程执行另一种形式的操作。(如果您执行并行执行,第二个模型的工作效果会更好,因为只有计时器线程与事件队列交互,因此不需要锁定)


最后,如何更频繁地运行事件?完全放弃计时器,只需连续将项目从队列中移出,忽略它们的到期日期。

一种方法是使用一组挂起事件(按“到期日期”排序)并且使用一个定时器,它的触发频率足以满足您想要使用的时间间隔(例如,这里每250ms一次就足够了)

每次(单个)计时器启动时,它都会不断检查列表的前面,如果前面的项目在过去有一个到期日期,那么我们将该项目出列并安排它运行(您是在计时器线程本身上运行事件,还是例如启动新的
任务
s来执行它们,在一定程度上取决于事件是否需要并行发生以及事件处理所需的时间)

通常情况下,每个事件对象的结构中都会嵌入某种类型的事件,因此此调度代码非常简单。重复事件可能会将其“下一次”执行作为其自身操作的一部分排队,或者您可以选择由计时器线程执行另一种形式的操作。(如果您执行并行执行,第二个模型的工作效果会更好,因为只有计时器线程与事件队列交互,因此不需要锁定)


最后,如何更频繁地运行事务?完全放弃计时器,只需不断地将项目从队列中移出,忽略它们的到期日期。

当然,不要使用计时器。说真的,计时器处理程序的主体除了调用另一个方法外,什么都不做。您可以随时调用该方法。例如,
OnTimer1(){DoSomething1()}
。如果您想立即调用它,只需直接调用
DoSomething1()
当然,不要使用计时器。说真的,计时器处理程序的主体除了调用另一个可以随时调用的方法外,什么都不做。例如
OnTimer1(){DoSomething1()}
。如果您想立即调用它,只需直接调用
DoSomething1()
我想我的问题是,生成序列是一个恼人的部分,因为有些事件会在其他事件触发一次之前触发几次。让计时器处理排序将使我更具声明性,并避免我编写自己的逻辑来生成排序列表中的事件-我肯定可以这样做,我只希望我还假设会有一种模拟技术来帮助测试计时器交互,生成序列时不需要实际延迟,但顺序正确。@NickP-正如我在第三段中提到的,最终核心循环是沿着
dequeue front event.Grab actionn、 如果是重复事件,将间隔添加到截止日期并排队。运行操作
。如果排队最终将此事件放回队列的最前面,就这样吧。我没有看到复杂性。我想我第一次忽略了这一部分-这听起来绝对是一个足够简单的解决方案,计时器的想法也很简单如果我还需要的话,实时延迟很低。我会给它一个简短的说明。@Damien_不信者我不是C#程序员,所以请原谅我的无知。SortedList是否对数据进行了完全排序?如果是的话,优先级队列实现会更好地实现可伸缩性。优先级队列是离散事件模拟中使用的标准方法eling,因为重点总是放在下一个将要发生的事件上,即发生时间最短的事件。以后的事件不需要完整的排序属性。@pjs-我知道.NET中没有更具体的优先级队列集合。
SortedX
集合是最接近的。这就是我选择
的原因>SortedList
。我想我的问题是,生成序列是一个令人讨厌的部分,因为有些事件会在其他事件触发一次之前触发几次。让计时器处理排序将使我更具声明性,并避免我编写自己的逻辑来生成排序列表中的事件-我肯定可以这样做,我很高兴我只是不想重新创造那一部分。我还以为有