C#四种计时器Timer的区别和用法

C#四种计时器Timer的区别和用法

在C#编程中,计时器是很常用的功能。在.NET Framework中,提供了四种不同的计时器Timer。本文将详细讲解这四种计时器的区别和用法。

1. System.Timers.Timer

System.Timers.Timer是继承自System.ComponentModel.Component类的一个计时器。它在间隔一定时间(由Interval属性设置)后,触发一次Elapsed事件。在此事件中,执行处理程序来完成需要进行的操作。System.Timers.Timer采用多线程,可以同时处理多个计时器事件。

用法示例

using System;
using System.Timers;

public class Program
{
    private static Timer timer;

    public static void Main()
    {
        // 创建计时器实例
        timer = new Timer();
        // 设置计时器时间间隔为500毫秒
        timer.Interval = 500;
        // 绑定计时器事件
        timer.Elapsed += Timer_Elapsed;
        // 启动计时器
        timer.Start();

        Console.WriteLine("按任意键结束程序...");
        Console.ReadKey();
    }

    // 计时器事件处理程序
    private static void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("当前时间:" + DateTime.Now);
    }
}

2. System.Threading.Timer

System.Threading.Timer是一个基于线程池的计时器,它可以周期性地调用一个回调方法或者执行一个一次性的Delay。与System.Timers.Timer不同,它的回调方法是直接运行在线程池中,而不是在新的线程中。

用法示例

using System;
using System.Threading;

public class Program
{
    private static Timer timer;

    public static void Main()
    {
        // 创建计时器实例
        timer = new Timer(new TimerCallback(Timer_Callback), null, 0, 500);

        Console.WriteLine("按任意键结束程序...");
        Console.ReadKey();
    }

    // 计时器回调方法
    private static void Timer_Callback(object state)
    {
        Console.WriteLine("当前时间:" + DateTime.Now);
    }
}

3. System.Windows.Forms.Timer

System.Windows.Forms.Timer是WinForm应用程序中的计时器。它继承自System.ComponentModel.Component类,但并没有绑定到UI线程上。该计时器每隔一定时间(由Interval属性设置)就会触发Tick事件。

用法示例

using System;
using System.Windows.Forms;

public class Program : Form
{
    private static Timer timer;

    public static void Main()
    {
        // 创建计时器实例
        timer = new Timer();
        // 设置计时器时间间隔为500毫秒
        timer.Interval = 500;
        // 绑定计时器事件
        timer.Tick += Timer_Tick;
        // 启动计时器
        timer.Start();

        Application.Run(new Program());
    }

    // 计时器事件处理程序
    private static void Timer_Tick(object sender, EventArgs e)
    {
        Console.WriteLine("当前时间:" + DateTime.Now);
    }
}

4. System.Diagnostics.Stopwatch

System.Diagnostics.Stopwatch是一个较为简单的计时器,只能用于测量时间间隔。它使用高精度计时器,可以达到微秒级精度,在代码性能分析和调试中有很好的应用。

用法示例

using System;
using System.Diagnostics;

public class Program
{
    public static void Main()
    {
        // 创建计时器实例
        Stopwatch stopwatch = new Stopwatch();
        // 开始计时
        stopwatch.Start();

        // 模拟一个需要计时的操作
        for (int i = 0; i < 10000000; i++)
        {
            Math.Sqrt(i);
        }

        // 停止计时
        stopwatch.Stop();

        // 输出时间间隔
        Console.WriteLine("运行时间:" + stopwatch.ElapsedMilliseconds + "毫秒");
    }
}

结论

四种计时器的区别和用法如下表:

计时器 区别 用途
System.Timers 基于多线程 定时触发事件,执行一些操作
System.Threading 基于线程池 后台任务计时
System.Windows Windows Form中的计时器,包含了一个UI thread的同步执行方法。 界面上的计时器,适用于UI更新的计时操作。
System.Diagnostics.Stopwatch 仅用于计时,无法周期性触发事件 测量代码性能,统计算法执行时间等等。

根据实际需要进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#四种计时器Timer的区别和用法 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • .NET Core中如何实现或使用对象池?

    .NET Core中如何实现或使用对象池? 对象池是一种用于重复使用对象的技术,可以提高性能和减少内存分配。在.NET Core中,我们可以使用对象池来重复使用对象。本攻略将介绍如何在.NET Core中实现或使用对象池,并提供两个示例说明。 实现对象池 在.NET Core中,我们可以使用以下类来实现对象池: 1. ObjectPool ObjectPoo…

    C# 2023年5月17日
    00
  • 解决jQuery uploadify在非IE核心浏览器下无法上传

    解决 jQuery uploadify 在非 IE 核心浏览器下无法上传,可以通过以下步骤实现: 1. 原因 非 IE 核心浏览器(如 Chrome、Firefox 等)不允许跨域上传文件,而 uploadify 默认使用了 flash 进行文件上传,flash 模式下不能跨域上传,导致文件上传失败。 2. 解决方案 可以通过以下两种方式来解决这个问题: 2…

    C# 2023年5月31日
    00
  • C#将Word转换成PDF方法汇总(基于Office和WPS)

    将Word文档转换为PDF格式是一项常见的任务,C#语言可以通过Office和WPS两种方式来实现。本文将提供详细的“C#将Word转换成PDF方法汇总(基于Office和WPS)”的完整攻略,包括如何使用Office和WPS来实现Word转PDF的功能,以及示例代码。 使用Office实现Word转PDF 使用Office可以通过COM组件来实现Word转…

    C# 2023年5月15日
    00
  • Dictionary扩展基础类向字典中添加键和值

    当我们需要在Python的字典中添加键和值的时候,可以使用基础的Dictionary扩展类来实现。这个类是使用Python内置的字典类作为基类,并扩展了一些额外的方法。下面将详细讲解如何使用这个类向字典中添加键和值。 首先我们需要导入Dictionary扩展基础类:collections.defaultdict。默认情况下,当我们向字典中添加不存在的键时,会…

    C# 2023年5月15日
    00
  • 详解.NET 4.0中的泛型协变(covariant)和反变(contravariant)

    在讲解.NET 4.0中的泛型协变和反变之前,需要先了解一下泛型的一些基本概念。 泛型的基本概念 在 C# 中,泛型是为了让我们在编写代码时更加灵活而设计的一个特性。泛型的核心是参数化类型,它可以让我们在编写代码时,不确定类型、保证类型安全、重用代码。通俗的说,泛型就是让代码能够适用于任何数据类型,如List、Dictionary等。 那么,什么是泛型协变和…

    C# 2023年6月3日
    00
  • C# 如何设置label(标签)控件的背景颜色为透明

    首先我来详细讲解一下 “C# 如何设置label(标签)控件的背景颜色为透明” 的攻略吧。 1. 知识储备 在讲解攻略之前,我们需要了解一下C#中控件的样式。控件的样式通常有三种: Border,只有边框 Background,有背景颜色但没有边框 None,既没有边框也没有背景颜色 如果一个控件的样式是Background,则可以将它的背景颜色设置为透明。…

    C# 2023年6月6日
    00
  • C#中AutoResetEvent控制线程用法小结

    下面就详细讲解一下C#中AutoResetEvent控制线程用法的完整攻略。 什么是AutoResetEvent? AutoResetEvent是一个同步基元,也是用于多线程编程的一个重要之一,它用于协调多个线程之间的同步。AutoResetEvent主要有两个用途: 线程等待 线程信号 AutoResetEvent是系统提供的,可以定时地向操作系统CPU请…

    C# 2023年6月6日
    00
  • 深入浅析C# 11 对 ref 和 struct 的改进

    深入浅析C# 11对ref和struct的改进 在C# 11中,对于ref和struct这两个关键词进行了一些改进和优化,本文将对这些改进进行详细的讲解。 对于ref的改进 在C# 11中,ref的作用被扩大到了包括字段、属性、方法参数和返回值等方面。 使用ref字段 我们可以使用ref来引用一个字段,并且可以对其进行修改,如下所示: public clas…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部