System.Timer elapsed 事件似乎在 .Net 中短时间间隔内延迟触发

2023-12-03

我通过 UART 端口对系统进行采样,然后将信息记录在带有时间戳(包括毫秒)的文件中。如果我以 1 秒的间隔采样,数据会按预期返回......类似于

1:52:45 PM 750 data
1:52:45 PM 750 data
1:52:45 PM 750 data
1:52:46 PM 750 data

但是,如果我将计时器的间隔减少到 100 毫秒,数据就会返回

1:52:45 PM 531 data
1:52:45 PM 640 data
1:52:45 PM 750 data
1:52:45 PM 859 data
1:52:45 PM 968 data
1:52:46 PM 78 data

总是迟到一点。

计时器间隔越小,情况就会变得更糟......我在这里错过了什么?


时钟漂移。对于普通计时器来说非常典型。原因是它们通常是使用睡眠函数来实现的。睡眠函数总是保证至少睡眠指定的时间,但不保证不睡眠超过该时间,实际上它总是累积漂移。

有多种方法可以编写计时器来补偿漂移并平均达到目标。

我最喜欢的计时器之一是固定步进计时器,它有一个谨慎的滴答声。它非常简单,看起来像这样:

var t = DateTime.Now + TimeSpan.FromSeconds(1);
for (;;)
{
    if (DateTime.Now >= t)
    {
        t += TimeSpan.FromSeconds(1); // Tick!
    }
}

这是一个粗糙但有效的计时器,下面是我为 WPF 计时器构建的时钟示例,其中内置计时器出现漂移。这个计时器要复杂得多,并且不会占用您的 CPU。但它清楚地说明了计时器所存在的典型问题。

这里的 OnTimerTick 使用内置计时器,该计时器会出现漂移,但它会调整间隔以补偿漂移。

/// <summary>
/// Occurs when the timer interval has elapsed.
/// </summary>
public event EventHandler Tick;

DispatcherTimer timer;

public bool IsRunning { get { return timer.IsEnabled; } }

long step, nextTick, n;

public TimeSpan Elapsed { get { return new TimeSpan(n * step); } }

public FixedStepDispatcherTimer(TimeSpan interval)
{
    if (interval < TimeSpan.Zero)
    {
        throw new ArgumentOutOfRangeException("interval");
    }
    this.timer = new DispatcherTimer();
    this.timer.Tick += new EventHandler(OnTimerTick);
    this.step = interval.Ticks;
}

TimeSpan GetTimerInterval()
{
    var interval = nextTick - DateTime.Now.Ticks;
    if (interval > 0)
    {
        return new TimeSpan(interval);
    }
    return TimeSpan.Zero; // yield
}

void OnTimerTick(object sender, EventArgs e)
{
    if (DateTime.Now.Ticks >= nextTick)
    {
        n++;
        if (Tick != null)
        {
            Tick(this, EventArgs.Empty);
        }
        nextTick += step;
    }
    var interval = GetTimerInterval();
    Trace.WriteLine(interval);
    timer.Interval = interval;
}

public void Reset()
{
    n = 0;
    nextTick = DateTime.Now.Ticks;
}

public void Start()
{
    var now = DateTime.Now.Ticks;
    nextTick = now + (step - (nextTick % step));
    timer.Interval = GetTimerInterval();
    timer.Start();
}

public void Stop()
{
    timer.Stop();
    nextTick = DateTime.Now.Ticks % step;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.Timer elapsed 事件似乎在 .Net 中短时间间隔内延迟触发 的相关文章

  • 为 Razor 组件添加 XML 文档

    有没有办法为 Razor 组件添加 XML 文档 我注意到 Microsoft 的一些组件有 IntelliSense 中显示的文档 然而 将通常的 XML 文档添加到代码隐藏部分类似乎不起作用
  • 检查对象是否更改的最佳实践是什么?

    我需要知道如何检查对象是否发生更改 基本上我需要一个名为 TrackChanges 的属性 当我将其设置为 true 一次并且如果该对象中的任何数据被 更改 时 同一对象上的方法 IsObjectChanged 可以返回 true 您是否曾
  • 如何在不下载内容的情况下执行 GET 请求?

    我正在开发一个链接检查器 一般来说我可以执行HEAD请求 但是有些网站似乎禁用了这个动词 所以在失败时我还需要执行GET请求 仔细检查链接是否确实已失效 我使用以下代码作为我的链接测试器 public class ValidateResul
  • 如何以一种形式发布两个或多个模型?

    我正在为一个项目开发互联网课程计划应用程序 该课程计划是根据以下模型构建的 使用数据库优先方法中的实体框架生成 public partial class Subject public int Id get set public string
  • 数组与列表的性能

    假设您需要一个需要频繁迭代的整数列表 数组 我的意思是非常频繁 原因可能有所不同 但可以说它位于大容量处理的最内层循环的核心 一般来说 人们会选择使用列表 List 因为它们的大小具有灵活性 最重要的是 msdn 文档声称列表在内部使用数组
  • VS2017在nuget包中将“Build Action”设置为“Content”

    我创建我的nuget包在gitlab使用以下命令行 nuget pack Prop Configuration Release OutputDirectory nuget REPONAME APPNAME APPNAME csproj 如果
  • 在我的网站上显示 Google Analytics(分析)仪表板

    我设置了一个 ASP NET 网站 并使用 Google Analytics 进行页面跟踪 我唯一不喜欢的是我必须离开我的网站 到 Google Analytics 网站 才能看到该报告 有什么方法可以使用他们拥有的所有 AJAX 在我自己
  • InvalidOperationException:无法解析类型“Microsoft.AspNetCore.Http.IHttpContextAccessor”的服务

    我开始将我的 asp net core RC1 项目转换为 RC2 并面临现在的问题IHttpContextAccessor没有解决 为了简单起见 我使用 Visual Studio 模板创建了新的 ASP NET RC2 项目ASP NE
  • DispatcherTimer 未按时执行

    我正在使用 c 中的 DispatchTimer 编写一个时钟应用程序 但由于某些原因 我的时钟似乎时不时地跳过 1 秒 例如 52 秒 gt 54 秒 跳过 53 秒 在我看来 计时器并不是每秒都执行一次 DispatcherTimer
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 文件显示在 Visual Studio 的解决方案资源管理器中,并带有快捷方式图标。这意味着什么?

    我已经下载了FParsec的库源代码 所有文件都带有快捷方式符号 这是什么意思 当该项目添加到该项目时 它被添加为链接Project gt Add Existing Item gt Add as Link 该文件很可能托管在目录结构中的另一
  • 当用户打开文件时如何锁定对文件的访问?

    我正在编写一个 C NET 程序 该程序使用 XmlSerializer 对当前用户正在处理的项目与 XML 文件进行序列化和反序列化 这工作正常 但我试图找到一种方法来防止两个用户从网络驱动器打开同一个文件并让一个用户覆盖前一个用户的保存
  • DataGridView 中的 C# FormatException

    我创建了一个带有一些列的 DataGridView 订单列仅允许用户输入 int 数字 当我输入 j 例如 时 它会抛出 FormatException 并且我尝试添加 try catch 来解决问题 但它看起来不起作用 private v
  • 将变量作为参数传递与传递另一个函数的返回值时出现“无效过程调用”错误

    我收到错误 无效的过程调用或参数 AddRange 当传递一个变量到ArrayList AddRange https msdn microsoft com en US library zhfwys3c 28v vs 110 29 aspx
  • 如何获取可用系统内存的大小?

    C NET 中是否可以获取系统可用内存的大小 如果是的话怎么办 Use Microsoft VisualBasic Devices ComputerInfo TotalPhysicalMemory http msdn microsoft c
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 如何在加载.NET WinForm应用程序user.config文件时捕获异常?

    有时 在使用默认配置系统的 NET 2 0 WinForm 桌面应用程序中 user config文件将被损坏并且无法再加载 当配置系统尝试加载它时 它会抛出一个System Xml XmlException 抛开 为什么文件首先被损坏 的
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默

随机推荐

  • 使用background-size:cover时如何获取图像的比例?

    我需要计算出图像缩放了多少 我正在设置背景图像body与background size cover 基本上 无论屏幕尺寸是什么 图像将始终保持其纵横比并扩展 或缩小 直到填满屏幕的宽度和高度 然后它会自行定位 使其在垂直和水平方向上居中 并
  • 下面的 URLConnection 出了什么问题?

    也可以看看 Objective C 带有 Cookie 的异步 Web 请求 我花了一天时间写这段代码 谁能告诉我这里出了什么问题吗 WSHelper 是从 NSObject 继承的 我什至尝试过 NSDocument 和 NSObject
  • GooglePlayServicesUtil 与 GoogleApiAvailability

    我正在尝试在我的 Android 应用程序中使用 Google Play 服务 正如Google文档所说 我们在使用Google API之前需要检查它是否可用 我已经搜索了一些方法来检查它 这是我得到的 private boolean ch
  • 从代码隐藏设置 ResourceDictionary DataContext

    我正在尝试从资源字典后面的代码设置一个 ResourceDictionary DataContext 我有一个使用自己的样式 资源字典 的数据模板 该样式包含一个具有自己的样式的复选框 在 CheckBox Checked 事件中 我想引用
  • iOS iPhone 5 选择正确的故事板

    我尝试在我的 iOS 项目中使用这两个故事板 但我无法获取切换到适当故事板的代码 相反 该代码绝对不执行任何操作 是不是我没有正确设置控制开关的设置 非 iPhone 5 设备的主故事板称为 MainStoryboard iphone 5合
  • 如何在 Xamarin 中的视图控制器之间传递数据

    我正在尝试在我的第一个和第二个之间传递一些数据ViewController 我已经实例化了第二个视图控制器 如下所示 RegistrationViewController registration new RegistrationViewC
  • Python 中的 NLP:矢量化后从 SelectKBest 获取单词名称

    我似乎无法找到我的确切问题的答案 有人可以帮忙吗 我的数据框 df 的简化描述 它有 2 列 一列是一堆文本 注释 另一列是一个二进制变量 指示解析时间是否高于平均水平 y 我对文本做了词袋 from sklearn feature ext
  • phpMyAdmin - 无法连接 - 无效设置 - 自从我添加 root 密码以来 - 被锁定

    我运行XAMPP 几天前 我通过 phpmyadmin 设置了 root 密码 从那一刻起我就无法访问 phpMyAdmin 我按照帮助这个链接但那里一切似乎都很好 在 config inc php 中 我什至尝试完全卸载 xampp 重新
  • 旋转动画不适用于 chrome

    我制作的动画可以在 Firefox 上运行 但不能在 Chrome 上运行 我已经尝试了十几种解决方案 但似乎无法使其发挥作用 这是我的代码 path animation name turn transform origin 50px 50
  • 如何在keycloak管理控制台中对客户端进行IP限制

    我在 keycloak 管理控制台中定义了一个客户端 以使用 client credentials 流授权它在我的应用程序中调用服务器到服务器 api 一切都很好 我想对该客户端应用 IP 限制 我可以在管理控制台中的哪里定义此限制 我在k
  • XML 节点的包装组

    我正在使用 PHP5 我需要将 XML 转换为以下形式
  • InvokeExact 对对象,其类型由类加载器动态加载

    我花了一整天的时间来解决这个问题 我的问题是如何对实例进行 MethodHandle invokeExact 调用 该实例的类类型是在程序运行时动态加载的 为了使问题更清楚 我在下面展示了我的示例代码 Class
  • 使用 java applet 查看 .doc 文件

    我有一个网络应用程序 我已经在服务器端生成了 xml 格式的 MS Word 文档 Word 2003 XML 文档 我需要使用某种查看器向客户端用户显示此文档 那么 问题是 我可以使用哪些库来解决这个问题 我需要一个API来在客户端查看w
  • 如何使用xslt将json转换为xml

    如何将 JSON 转换为 XML 考虑
  • 如何使用 Ninject 将 ModelState 作为参数注入?

    我对 Ninject 很陌生 我想找到一种方法将控制器的 Modelstate 进一步传递到服务层 我现在拥有的 private readonly IAccountService service public AccountControll
  • 如何获取R代码表达式中的所有变量?

    如何解码 R 中的表达式以获取涉及的所有变量 例如 如果您有 z lt x y get all variables z 1 x y 您可以使用all vars 但你需要引用你的表达 all vars quote x y 1 x y 你不能只
  • Ninject 模型验证器导致中等信任度问题

    Using 忍者2 2 with ASP NET MVC 3 我有一个控制器和一些位于外部程序集中的类 它们是通过加载NinjectModule来自所述组件 这些模型包含一些验证属性 当对采用具有验证属性的模型的操作执行后操作时 Ninje
  • 如何从安装部署项目中排除 app.config

    如何从安装部署项目中排除 app config 我必须维护 app config 中的加密部分 我知道的唯一 半 嵌入方式是使用 RsaProtectedConfigurationProvider 或 DPAPI 提供程序运行代码 由于我必
  • 如何使decimal.TryParse保留尾随零?

    目前如果我这样做 decimal d temp 22 00 decimal TryParse temp NumberStyles Any CultureInfo InvariantCulture out d 然后 d 结果是 22 有什么方
  • System.Timer elapsed 事件似乎在 .Net 中短时间间隔内延迟触发

    我通过 UART 端口对系统进行采样 然后将信息记录在带有时间戳 包括毫秒 的文件中 如果我以 1 秒的间隔采样 数据会按预期返回 类似于 1 52 45 PM 750 data 1 52 45 PM 750 data 1 52 45 PM