我想实现一个在已知时间触发事件的实时系统。我可以使用System.Timers.Timer,并在每个事件结束时计算下一个事件发生的时间并进入睡眠模式,直到它在几毫秒后发生。
问题是,这是我唯一可用的选项还是有一种方法可以在已知时间之后触发事件,而无需启动数百个计时器?
问题的原因是,虽然我希望每个事件都能很快执行,但事件的开始+持续时间可能会超过下一个事件的开始,我不希望这样。因此,无论你建议什么,都必须独立于执行的代码。
答案 0 :(得分:1)
首先,Windows不是real time operating system。
其次,在.NET平台上运行的C#语言,它是一个带垃圾收集器的运行时。 垃圾收集器的一个特点是它偶尔会导致停止世界。这种暂停可能很长,甚至几十秒(不是几毫秒!)
总结一下,我们可以说你的任务,即时间到毫秒是至关重要的,是不可行的。
答案 1 :(得分:0)
我这样做...我创建了一个计时器,并在每个“tick”,我检查我是否可以执行该工作。我不知道这是否是最好的方式,但它正在发挥作用。
/// <summary>
/// Indicate if the task is running
/// </summary>
private volatile bool _TaskIsRunning;
/// <summary>
/// Indicate if the task is running
/// </summary>
public bool TaskIsRunning
{
get { return _TaskIsRunning; }
set { _TaskIsRunning = value; }
}
public ClassConstructor()
{
TimerGetAndSendContent = new System.Timers.Timer();
TimerGetAndSendContent.Elapsed += Elapsed;
TimerGetAndSendContent.Interval = Math.Ceiling(TsContent.TotalMilliseconds);
TimerGetAndSendContent.Start();
}
public void Elapsed(Object sender, System.Timers.ElapsedEventArgs e))
{
if (!TaskIsRunning)
{
try
{
TaskIsRunning=true;
//Your code
}
finally
{
TaskIsRunning=false;
}
}
}