惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
IT之家
IT之家
博客园 - 聂微东
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
小众软件
小众软件
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Visual Studio Blog
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
阮一峰的网络日志
阮一峰的网络日志
宝玉的分享
宝玉的分享
博客园 - 三生石上(FineUI控件)
大猫的无限游戏
大猫的无限游戏
博客园 - Franky
量子位
月光博客
月光博客
博客园 - 【当耐特】
博客园 - 叶小钗

博客园 - love/coder

Android studio环境配置 phpstorm/clion设置文件头部版权信息 php7.4需要升级vc++版本问题 SqlServer查询所有表名及其数据行数 图解 CSS 选择器 C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用) Winform控件命名规则 JQuery UI实现浮动客服并拨号 winform中的多线程与异步加载 base64的使用 编程命名规范(网文) 常浏览编程技术资源 接口控制器层(Controller层)设计(网文) SpringBoot编写WebApi~(1)idea创建项目并打包 使用FileBrowser搭建文件服务 VS新建文件时在头部附加版权信息 记录一次Apache2.4启动PHP的Curl扩展不成功的问题 FileZilla Server搭建ftp服务 VS安装插件,按CTRL+鼠标左键进入函数 .NET8的AOT技术
C#中的Timer定时器
love/coder · 2025-03-05 · via 博客园 - love/coder

在C#中,有几种不同类型的计时器(Timer),它们适用于不同的场景和需求。以下是四种主要的计时器类:

System.Windows.Forms.Timer (WinForms Timer)

  • 专为Windows Forms应用程序设计。
  • 在UI线程上触发Tick事件,因此非常适合用于需要更新UI控件的场景。
  • 由于它是在UI线程上运行的,如果事件处理程序执行时间过长,可能会阻塞UI线程,导致界面无响应。

System.Timers.Timer

  • 是基于事件的计时器,适用于所有.NET应用程序。
  • 它在独立于UI的线程池线程上触发Elapsed事件。
  • 因此它不会阻塞UI线程,但如果你需要更新UI,你需要使用Control.Invoke或Control.BeginInvoke来确保从UI线程进行更新。

System.Threading.Timer

  • 提供了最底层的计时器功能,适用于需要高性能的应用程序。
  • 它同样使用线程池线程来执行回调方法,因此也不会阻塞UI线程。
  • 不提供任何事件模型,而是通过构造函数接受一个回调方法,当时间到了会调用这个方法。
  • 使用起来相对复杂一些,因为它不提供停止计时器的方法,你必须保持对计时器对象的引用以便能够取消它。

System.Reactive.Concurrency.Timer

  • 来自Reactive Extensions (Rx) 库,提供了更灵活的定时器实现,支持复杂的调度需求。
  • 允许指定调度程序,从而可以控制计时器在哪个线程或上下文中运行。
  • 对于复杂的异步编程模式非常有用,但需要额外引入Rx库。

选择哪种计时器取决于你的具体应用场景、性能要求以及是否需要与UI交互等因素。对于大多数WinForms应用程序来说,System.Windows.Forms.Timer通常是最简单直接的选择;而对于后台任务或者需要更高精度和性能的情况,System.Timers.Timer 或 System.Threading.Timer 可能更为合适。