C#定时器深度对比:System.Timers.Timer vs System.Threading.Timer性能实测与选型指南 - 教程

news/2025/10/5 21:39:47/文章来源:https://www.cnblogs.com/yxysuanfa/p/19127074

本文通过真实基准测试揭秘两种常用定时器的性能差异,助你做出最佳选择

一、C#定时器全景概览

在C#生态中,不同定时器适用于不同场景。以下是主流定时器的核心特性对比:

定时器类型命名空间适用场景触发线程精度内存开销依赖框架
System.Windows.Forms.TimerSystem.Windows.FormsWinForms UI更新UI线程中等Windows Forms
System.Timers.TimerSystem.Timers服务/组件任务线程池线程中高通用
System.Threading.TimerSystem.Threading高性能后台任务线程池线程极低通用
DispatcherTimerSystem.Windows.ThreadingWPF/Silverlight UIUI线程中等WPF
System.Web.UI.TimerSystem.Web.UIASP.NET Web Forms服务端异步请求ASP.NET Web Forms

二、核心对决:Timers.Timer vs Threading.Timer

1. 架构设计差异

2. 关键特性对比

特性System.Timers.TimerSystem.Threading.Timer
触发方式Elapsed事件TimerCallback委托
线程模型线程池线程(通过SynchronizingObject可同步到UI)直接在线程池线程执行
启停控制Start()/Stop()方法Change()方法动态调整
资源释放实现IDisposable必须显式Dispose
易用性★★★★☆ (事件模式更直观)★★★☆☆ (需手动处理线程安全)
内存开销高(每个实例约18KB)极低(零内存分配)
精度稳定性中等(首次触发延迟90ms)高(首次触发延迟低)

三、性能实测:BenchmarkDotNet数据揭秘

测试环境

基准测试代码

[SimpleJob(RuntimeMoniker.Net80)]
[MemoryDiagnoser]
public
class TimerBenchmarks
{
[Params(100
)]
public int Interval = 100
;
[Params(1000
, 5000
)]
public int Duration = 5000
;
// 基准测试方法(完整实现见上文)
[Benchmark(Baseline = true
)]
public int SystemTimersTimer(
) {
...
}
[Benchmark]
public int SystemThreadingTimer(
) {
...
}
[Benchmark]
public int TheoreticalCount(
) => Duration / Interval;
}

测试结果

在这里插入图片描述

MethodIntervalDurationMeanAllocatedAlloc Ratio
SystemTimersTimer10010001,092,123,360.0 ns18896 B1.00
SystemThreadingTimer10010001,091,974,353.3 ns0 B0.00
TheoreticalCount10010000.4 ns0 B0.00
SystemTimersTimer10050005,030,020,742.9 ns18824 B1.00
SystemThreadingTimer10050005,029,031,946.2 ns0 B0.00
TheoreticalCount10050000.4 ns0 B0.00

关键结论

  1. 时间性能几乎相同:两种定时器执行时间差异<0.01%(可忽略)
  2. 内存分配天壤之别
    • Timers.Timer:每次测试分配~18KB内存
    • Threading.Timer零内存分配(Alloc Ratio=0)
  3. 精度表现
    • 首次触发延迟约90ms(两种定时器都存在)
    • 长期运行精度更高(5000ms测试误差仅0.6%)
  4. 理论vs实际触发次数
    // 1000ms测试:理论触发10次,实际触发约10.9次
    // 5000ms测试:理论触发50次,实际触发约50.3次

四、实战选型指南

1. 首选System.Threading.Timer的场景

// 高性能后台服务示例
public
class BackgroundService
{
private
readonly System.Threading.Timer _timer;
public BackgroundService(
)
{
_timer =
new System.Threading.Timer(_ =>
{
// 1. 内存清理
CleanUpMemory(
)
;
// 2. 数据同步
SyncDataToDatabase(
)
;
// 3. 健康检查
PerformHealthCheck(
)
;
}
,
null
, 0
, 60_000
)
;
// 每分钟执行
}
}

适用场景

  • 内存敏感型应用(如微服务、容器化应用)
  • 高频触发任务(间隔<100ms)
  • 无需UI交互的后台服务
  • 资源受限环境(嵌入式、IoT设备)

2. 首选System.Timers.Timer的场景

// 带UI集成的服务组件
public
class DataMonitor
{
private
readonly System.Timers.Timer _timer;
private
readonly Action _updateUiAction;
public DataMonitor(Action updateUi)
{
_updateUiAction = updateUi;
_timer =
new System.Timers.Timer(1000
)
;
_timer.Elapsed += OnTimedEvent;
_timer.SynchronizingObject =
this
;
// 同步到UI线程
}
private void OnTimedEvent(object? sender, ElapsedEventArgs e)
{
// 1. 获取实时数据
var data = FetchRealTimeData(
)
;
// 2. 更新UI(自动切换到UI线程)
_updateUiAction(data)
;
}
}

适用场景

  • 需要事件模型的组件库
  • 需与UI线程交互的混合应用
  • 开发者偏好事件驱动编程
  • 定时器生命周期与组件绑定

3. 高精度场景优化技巧

// 首次触发延迟补偿方案
public
class HighPrecisionTimer : IDisposable
{
private
readonly System.Threading.Timer _timer;
private
volatile bool _firstCall = true
;
public HighPrecisionTimer(int intervalMs, Action callback)
{
_timer =
new System.Threading.Timer(_ =>
{
if (_firstCall)
{
_firstCall = false
;
callback(
)
;
// 立即补偿首次触发
_timer.Change(intervalMs, intervalMs)
;
}
else
{
callback(
)
;
}
}
,
null
, 0
, Timeout.Infinite)
;
// 初始只触发一次
}
public void Dispose(
) => _timer?.Dispose(
)
;
}

五、终极决策树

六、避坑指南

  1. 资源泄漏预防

    // 必须实现IDisposable
    public
    class TimerService : IDisposable
    {
    private System.Threading.Timer _timer;
    public void Dispose(
    )
    {
    _timer?.Dispose(
    )
    ;
    // 关键!
    _timer =
    null
    ;
    }
    }
  2. 线程安全黄金法则

    private int _counter;
    void TimerCallback(object? state)
    {
    // 错误:直接递增
    // _counter++; 
    // 正确:原子操作
    Interlocked.Increment(
    ref _counter)
    ;
    }
  3. 精度优化实践

七、总结

System.Timers.TimerSystem.Threading.Timer的核心差异在于设计哲学而非性能:

终极建议

完整测试代码已上传Github:https://gitcode.com/ben561/NLuaBenchmarkDotNetTest.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盛世华诞 举国同庆|热烈庆祝 LEWISAK 英勇重创消火栓 1 周年!

前情提要:我们在星光灿烂下倾听时代的钟声,我们在漫漫长夜中等待黎明的曙光,多少次,我们心潮难平,多少次,我们辗转难眠,多少次,我们都是为了这不同寻常的一天 —— LEWISAK 重创消火栓 1 周年! ! 望长空,历…

完整教程:<el-table>构建树形结构

完整教程:<el-table>构建树形结构pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

集团企业网站建设文案wordpress图片不清晰

C、Java、JavaScript和python几个语句的对比介绍 C、Java、JavaScript和python语言的for语句 C、Java和JavaScript的for语句的语法类似如下&#xff1a; for (初始条件; 循环条件; 循环后操作) { // 循环体代码 } 初始条件是在进入循环之前执行的语句&#xff0c;初始化循环…

如何在markdown中插入折叠框

rt,我使用的方法比较朴素简单。 直接在markdown中写入html的标签即可,如下: <details> <summary>标题</summary> 内容 </details>就会呈现以下效果:标题 内容

ESP32-C3 Vscode+ESP-IDF开发环境搭建 保姆级教程 - 教程

ESP32-C3 Vscode+ESP-IDF开发环境搭建 保姆级教程 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

网站数据模版收费网站推广

为什么80%的码农都做不了架构师&#xff1f;>>> 反正每次来做一个不熟悉的东西&#xff0c;就是各种的search ,前一次去做过一个apache的东西&#xff0c;各种蛋疼&#xff0c;各种不能用。好多的东西也是比较旧了的咯。 这次结合前辈的各种东借西拿&#xff0c;总…

CF2115 VP 记录

CF2115 Div1 B 比较人类智慧. 后面操作会覆盖前面的,考虑对序列 \(b\) 构造一种具有必要性的操作使得满足题目限制,因为一个重要事实是序列 \(a\) 并不唯一,只要对于任意位置,在被覆盖前没有覆盖其他位置的操作,或…

设计网站教程wordpress根目录没有.htaccess

近几年&#xff0c;我国潮玩市场经历了爆发式的发展阶段&#xff0c;尤其是盲盒市场屡创新高&#xff01;盲盒商品主打IP衍生品、周边等具有收藏价值的商品&#xff0c;深受市场的追捧&#xff0c;满足了不同年龄群体的需求。面对盲盒的蓝海市场&#xff0c;众多的品牌也纷纷加…

基于springboot的医护人员排班平台设计与构建(源码+文档+部署讲解)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做网站的软件公司中国室内设计师联盟

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 一、整体介绍 对话系统&#xff08;Chat&#xff09; 自主代理&#xff08;Agent&#xff09; 二、技术对比 技术差异 优…

2-SAT模板

洛谷p4782 #include<iostream> #include<vector> #include<algorithm> using namespace std; const int N=2e6+10; int n,m; int dfn[N],low[N],stk[N],instk[N],tot,cnt,scc[N],top; vector<int…

千度网站wordpress加联系方式

LntonAIServer作为一款智能视频监控平台&#xff0c;集成了多种先进的视频质量诊断功能&#xff0c;其中包括抖动检测和过暗检测算法。这些算法对于提升视频监控系统的稳定性和图像质量具有重要意义。 以下是对抖动检测算法和过暗检测算法的应用场景及优势的详细介绍。 一、L…

票务网站策划书手加工外包加工网

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 简介 在计算机视觉领域&#xff0c;准确地测量图像相似性是一项关键任务&#xff0c;具有广泛的实际应用。从图像搜索引擎到人脸识别系统和基于内容的推荐系统&#xff0c;有效比较和查找相似图像的能力非常重要。Siames…

lab5

流程图 到了这个lab5才算是真正看清除了整个lab的样子, 之前还一直纳闷lab2好像没什么用… 这个系统的核心思想是 分而治之。通过将整个键空间划分为多个分片(Shard),并将这些分片分配给不同的、可独立运行的服务器…

lab4

架构 架构图:简单说, 我们要建立的KV数据库是位于raft层之上的, 或者说我们的KV数据库使用了raft库。客户端(就是代码中的clerk)调用应用层(server)的RPC,应用层收到RPC之后,会调用Start函数,Start函数会立即返回…

公司网站要使用我个人的信息备案如何用表格做网站

7-10 解一元二次方程 分数 20 全屏浏览 切换布局 作者 李祥 单位 湖北经济学院 请编写程序&#xff0c;解一元一次方程 ax2bxc0 。 已知一元二次方程的求根公式为&#xff1a; 要求&#xff1a; 若 a0&#xff0c;则为一元一次方程。 若 b0&#xff0c;则方程有唯一解&…

公司关于网站建设的通知春风摩托车官方网

API作用使用场景curl localhost:9200/_cluster/health?pretty查看ES健康状态curl localhost:9200/_cluster/settings?pretty查看ES集群的设置其中persistent为永久设置&#xff0c;重启仍然有效&#xff1b;trainsient为临时设置&#xff0c;重启失效curl localhost:9200/_ca…

某中心2026年推出1111个技术实习岗位

某中心宣布2026年将提供1111个实习岗位,涵盖工程、产品管理、研究等技术领域。实习生将参与影响数百万互联网用户的实际项目,并享受包括无服务器应用平台在内的免费技术资源。某中心承诺2026年提供1111个实习机会 某…

NumPy广播:12个技巧替代循环,让数组计算快40倍

写Python数据处理代码时反复用for循环?这其实是在给程序性能交"税"。NumPy的广播(broadcasting)机制能让你摆脱这种困境——代码量更少,执行更快,关键是思维方式从"逐个迭代"转向"整体形状…

网站建设费用如何做账务处理wordpress 修改页面内容

198. 打家劫舍&#xff08;题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台&#xff09; 思路&#xff1a;dp题除背包外的另外一类题目&#xff0c;重点不在于看前面的情况&#xff0c;而在于考虑本节点的情况。一种情况&#xf…