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对多线程异常处理技巧分享

    一些.NET对多线程异常处理技巧分享 前言 在多线程编程过程中,异常处理通常是一个很容易被忽视的问题,它对程序的稳定性和可靠性有着关键的影响。本文将对多线程异常处理中所需要注意的问题进行讨论,并分享一些.NET对多线程异常处理技巧。 1. 对于多线程处理不可避免的异常 在多线程处理过程中,我们很难避免出现一些不可避免的异常,比如线程间互相通信的异常等。针对这…

    C# 2023年5月15日
    00
  • asp.net生成字母和数字混合图形验证码

    生成字母和数字混合图形验证码是一个常见的需求,可以用于用户注册、登录等场景,以防止恶意攻击或机器人程序的自动操作。本文将详细介绍如何在ASP.NET中生成字母和数字混合图形验证码。 步骤1:创建ASP.NET项目 首先,创建一个新的ASP.NET Web应用程序,为这个应用程序设置一个名称和位置,然后选择“Web Forms”模板。在创建完毕之后,确保项目正…

    C# 2023年5月31日
    00
  • npoi2.0将datatable对象转换为excel2007示例

    针对将DataTable对象转换为Excel2007的问题,可以使用NPOI来实现。步骤分为以下几个:首先创建一个Workbook对象;接着创建一个Sheet对象,指定Sheet名称;然后创建表头header;接着将header插入到Excel表格的第一行中;最后将DataTable中的数据逐行写入Excel表格中。 下面给出两个具体的示例说明: 示例一 u…

    C# 2023年6月8日
    00
  • asp.net(c#)实现从sqlserver存取二进制图片的代码

    实现从SQL Server存取二进制图片需要经历以下步骤: 在SQL Server中创建表来存储图片数据。通常,您需要为每个图像分配两个列:一个用于存储二进制数据,另一个用于存储图像的MIME类型。例如: CREATE TABLE [dbo].[ImageTable]( [ID] INT PRIMARY KEY IDENTITY(1,1), [ImageDa…

    C# 2023年5月31日
    00
  • c#实现数据同步的方法(使用文件监控对象filesystemwatcher)

    下面我来详细讲解一下“c#实现数据同步的方法(使用文件监控对象filesystemwatcher)”的完整攻略。整个过程中主要包括以下几个步骤: 创建两个文件夹folder1和folder2,用于模拟需要实现的数据同步场景; 在C#的控制台应用中,创建FileSystemWatcher类的实例; 配置FileSystemWatcher的监控参数(包括路径、所…

    C# 2023年5月15日
    00
  • C#单例模式与多线程用法介绍

    C#单例模式与多线程用法介绍 单例模式是C#编程中最常用的面向对象设计模式之一,在多线程环境下实现单例模式要注意线程安全问题。本文将从以下几个方面进行介绍: 单例模式的概念及说明 单例模式的实现方式 多线程环境下的单例模式实现 示例代码介绍 单例模式概述 单例模式是指一个类只能被实例化一次,通过提供全局唯一的访问点,来确保该类的对象只有一个。单例模式在多线程…

    C# 2023年6月7日
    00
  • 详解ASP.NET Core Docker部署

    详解ASP.NET Core Docker部署 在本攻略中,我们将深入讲解如何使用Docker容器来部署ASP.NET Core应用程序,并提供两个示例说明。 准备工作 在开始部署ASP.NET Core应用程序之前,您需要完成以下准备工作: 安装Docker 您需要在本地计算机上安装Docker。您可以从Docker官方网站下载并安装Docker。 创建A…

    C# 2023年5月17日
    00
  • 外键拆分手记

    我习惯性使用OData,它的$expand与层级查询非常好用,这个功能非常依赖于数据库的导航属性,也就是外键结构。最近想着把一个单体的系统拆分为多个小系统,首先需要处理外键依赖的问题。 多个服务各自有各自的数据库,数据库层面并不互通,也就无法使用外键约束。 我使用EF Core来描述数据库的结构,有两个实体类如下: public class AD_Insec…

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