热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#三个Timer

在C#中存在3种常用的这个

在C#中存在3种常用的 Timer

  1. System.Windows.Forms.Timer
  2. System.Timers.Timer
  3. System.Threading.Timer

零、System.Windows.Forms.Timer

这个 Timer 是单线程的,也就是说只要它运行,其他线程就要等着。

C# 三个Timer

这个 Timer 有如下特点:

  1. 完全基于UI线程,定时器触发时,操作系统把定时器消息插入线程消息队列中,调用线程执行一个消息泵提取消息,然后发送到回调方法Tick中;
  2. 使用 Start Stop 启动和停止 Timer;
  3. UI操作过长会导致 Tick 丢失;
  4. 可以使用委托Hook Tick事件;
  5. 精确度不高;
  6. 通过将 Enabled 设置为 True ,使 Timer 自动运行

从上面的第一个特点可以得知,该 Timer 会造成 WinForm UI 假死,因此如果需要定时处理大量计算或者大量IO操作的任务,不建议使用该 Timer ,接下来我们看一个例子体会一下在IO操作的情况下出现的假死情况:

我们在Form中放入两个Button 一个Lable和一个Timer

C# 三个Timer

private void Button_Click(object sender, EventArgs e)
{
    timer.Interval = 1000;
    timer.Tick += Timer_Tick;
    timer.Start();
}

private void Timer_Tick(object sender, EventArgs e)
{
    for (int i = 0; i <10000; i++)
    {
        File.AppendAllText(Directory.GetCurrentDirectory()+"test.txt", i.ToString());
        this.label_output.Text = "当前操作:插入数字" + i;
    }
}

我们单击计算按钮,我们会发现WinForm出现了假死(无法移动窗口、按钮无法点击等)

一、System.Timers.Timer

该 Timer 是基于服务器的计时器,是为在多线程环境中用于辅助线程而设计的,可以在线程间移动来处理引发的 Elapsed 事件,比上一个计时器更加精确。

该 Timer 有如下特点:

  1. 通过 Elapsed 设置回掉处理事件,且 Elapsed 是运行在 ThreadPool 上的;
  2. 通过 Interval 设置间隔时间;
  3. AutoReset 设置为 False 时,只在到达第一次时间间隔后触发 Elapsed 事件;
  4. 是一个多线程计时器;
  5. 无法直接调用 WinForm 上的控件,需要使用 委托
  6. 主要用在 Windows 服务中。

同样我们通过代码来看一下该 Timer 计时器怎么使用:

System.Timers.Timer timersTimer = new System.Timers.Timer();
private void Button_Click(object sender, EventArgs e)
{
    timersTimer.Interval = 1000;
    timersTimer.Enabled = true;
    timersTimer.Elapsed += TimersTimer_Elapsed;
    timersTimer.Start();
}

private void TimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    for (int i = 0; i <10000; i++)
    {
        this.BeginInvoke(new Action(() =>
        {
            this.label_output.Text="当前时间:"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        }), null);
    }
}

private void Button1_Click(object sender, EventArgs e)
{
    timersTimer.Stop();
}

运行上面代码,会发现WinForm界面假死的情况消失了。

二、System.Threading.Timer

该 Timer 同样也是一个多线程的计时器,它有如下特点:

  1. 多线程
  2. 和前两个计时器相比没有 StartStop 方法,如果要停止计时器,必须调用 Dispose 方法来销毁 Timer 对象;
  3. 调用 Dispose 方法后并不能马上停止所有的计时器,这是因为间隔时间小于执行时间时多个线程运行造成的,多个线程无法同时停止;

C# 三个Timer

  1. 是一个轻量级的计时器;
  2. 所有的参数全部在构造函数中进行了设置;
  3. 可以设置启动时间;
  4. 不建议再 WinForm 程序中使用。

我们来看一下代码(在控制台应用程序中输入以下代码):

static System.Threading.Timer threadingTimer;
static int numSum = 0;
static void Main(string[] args)
{
    threadingTimer = new System.Threading.Timer(new System.Threading.TimerCallback(threadingTimer_Elapsed), null, 0, 1000);
    Console.Read();
}
private static void threadingTimer_Elapsed(object state)
{
    for (int i = 0; i <10000; i++)
    {
        numSum++;
        Console.WriteLine("输出数字:"+i);
    }

    if (numSum > 10000)
    {
        threadingTimer.Dispose();
        Console.WriteLine("结束");
    }
}

注意:当我们不再需要多线程Timer计时器的时候,我们可以调用 Dispose 方法释放所占有的资源。但是因为Timer计时器是按线程池线程来安排回调执行的,因此回调可能发生在 Dispose方法的重载被调用之后,所以我们可以使用可使用 Dispose(WaitHandle) 方法等待所有回掉完成。


以上所述就是小编给大家介绍的《C# 三个Timer》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 我们 的支持!


推荐阅读
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 本文探讨了在Java中实现系统托盘最小化的两种方法:使用SWT库和JDK6自带的功能。通过这两种方式,开发者可以创建跨平台的应用程序,使窗口能够最小化到系统托盘,并提供丰富的交互功能。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
author-avatar
岳骏哲爱237
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有