.NET Framework中定时器timer的单线程与多线程使用讲解

.NET Framework中定时器timer的单线程与多线程使用讲解

什么是定时器timer

在 .NET Framework中,Timer 是一种计时器,用于定期执行一些操作。可以使用 Timer 指定在多长时间后执行一个操作。可用作定期检查磁盘驱动器、定期下载网页或文件,或定期脚本。Timer 可在 Windows.Forms、ASP.NET、WPF 或 Windows 服务应用程序中使用。

Timer的单线程使用

在单线程情况下,Timer比较容易使用,只需要创建一个计时器并设定时间,绑定定时器的事件即可。下面我们给出代码示例

using System;
using System.Timers;

public class InprocessTimerExample
{
    public static void Main()
    {
        Timer timer = new Timer(1000);  // 创建计时器,1000毫秒后执行一次
        timer.Elapsed += OnTimedEvent;  // 绑定事件
        timer.AutoReset = true;  // 自动重置
        timer.Enabled = true;  // 启用计时器

        Console.WriteLine("请按任意键结束...");
        Console.ReadLine();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("计时器经过了{0}毫秒", e.SignalTime.Millisecond);
    }
}

在上述示例中,创建了一个计时器,并设定时间为1000毫秒。然后通过绑定 Elapsed 事件,实现了在每隔一个1s的时间,输出当前毫秒数的效果。

Timer的多线程使用

在多线程环境下,Timer的使用方式稍微有些不同,我们需要考虑多线程环境下的线程安全问题。在多线程环境下,比较常见的一种做法是使用 System.Threading.Timer。使用方式与单线程略有不同,需要通过传递参数到定时器的方法中,并通过回调函数获取返回值。我们给出一个示例:

using System;
using System.Threading;
using System.Threading.Tasks;

public class MultithradingTimerExample
{
    static CancellationTokenSource cts = new CancellationTokenSource();
    static ManualResetEventSlim completedEvent = new ManualResetEventSlim(false);
    public static void Main()
    {
        Task queryTask = Task.Factory.StartNew(() =>
        {
            using (Timer timer = new Timer(new TimerCallback(MyMethod), cts.Token, TimeSpan.Zero, TimeSpan.FromSeconds(2)))
            {
                Console.WriteLine("等待计时器事件处理中...");
                completedEvent.Wait(cts.Token); 
            }

            Console.WriteLine("已完成计时器定时任务!");
        }, cts.Token);

        Console.WriteLine("按下任意按键结束计时器任务");
        Console.ReadKey();
        cts.Cancel();
        completedEvent.Set();

        queryTask.Wait(cts.Token); 
    }

    static void MyMethod(object state)
    {
        CancellationToken token = (CancellationToken)state;

        if (token.IsCancellationRequested)
        {
            Console.WriteLine("执行取消操作!");
            completedEvent.Set();
        }
        else
        {
            Console.WriteLine("计时器方法执行中...");
        }
    }
}

上述示例定义了一个 MultithradingTimerExample 类并使用了 System.Threading.Timer。在启动任务时,我们需要创建一个可以终止任务的 CancellationTokenSource,并将该 CancellationTokenSource.Token 作为计时器的回调函数的输入参数。使用 ManualResetEventSlim 以确保正确地回收事件处理线程,同时还保证顺序执行任务。

我们可以在 MyMethod() 方法中处理定时事件,并通过 CancellationToken.IsCancellationRequested 属性检查是否需要取消操作。一旦取消操作被请求,我们就可以通过调用 completedEvent.Set() 方法来释放等待事件处理程序的线程。

最后输出的结果为:

等待计时器事件处理中...
计时器方法执行中...
计时器方法执行中...
计时器方法执行中...
计时器方法执行中...
按下任意按键结束计时器任务
执行取消操作!
已完成计时器定时任务!

从中我们可以看到,即使在多线程情况下,定时器也可以正常运行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.NET Framework中定时器timer的单线程与多线程使用讲解 - Python技术站

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

相关文章

  • C#表达式目录树示例详解

    接下来我将为你详细讲解 C# 表达式目录树示例的完整攻略。 什么是C#表达式目录树? C# 表达式目录树是一个用于表示 C# 运行时代码语义的对象模型。它可以把 C# 代码解析为树型结构数据,这里的树指的是一种抽象的数据结构。在表达式目录树中,每个节点都代表着一个 C# 程序中的某个代码元素,比如方法调用、变量引用等。 表达式目录树的组成 C# 表达式目录树…

    C# 2023年5月31日
    00
  • asp.net 产生随机颜色实现代码

    产生随机颜色是 Web 开发中的一个比较常见的需求,下面是一份 asp.net 实现随机颜色的攻略。 方案一:使用 Random 类生成随机颜色值 可以通过 Random 类的 Next() 方法产生一个 32 位整数值,然后使用 Color.FromArgb() 方法将 32 位整数值转换为 Color 对象,从而实现随机颜色的生成。示例代码如下: Ran…

    C# 2023年5月31日
    00
  • DataReader、DataSet、DataAdapter和DataView使用介绍

    DataReader、DataSet、DataAdapter和DataView是数据访问中常用的几个对象,下面我会详细介绍它们的作用和使用方法。 一、DataReader DataReader是一种只读的、前向的数据流,用于对数据库进行查询操作。它可以一行一行地读取查询结果,不支持对数据进行修改,适用于大数据量查询,可以最大程度减少内存占用。使用DataRe…

    C# 2023年6月6日
    00
  • C# File.ReadAllLines – 读取文件的所有行

    File.ReadAllLines 方法是C#中用来读取文本文件所有行的方法。该方法返回一个字符串数组,其中每个元素都是文件中每行文本的一个字符串。 使用方法如下: string[] lines = File.ReadAllLines("file.txt"); 上述代码读取名为“file.txt”的文本文件中的所有行,并将它们存储在一个字…

    C# 2023年4月19日
    00
  • C#创建缩略图操作类实例

    下面我将详细讲解“C# 创建缩略图操作类实例”的完整攻略。 1. 前提准备 在使用 C# 创建缩略图操作类实例之前,需要先掌握以下知识和准备工作。- 需要安装 .NET Framework 环境;- 需要掌握基础的 C# 编程知识;- 需要了解 System.Drawing 命名空间。 2. 创建缩略图操作类 以下是创建缩略图操作类的代码示例: using …

    C# 2023年6月7日
    00
  • C#定时器实现自动执行的方法

    下面来详细讲解一下C#定时器实现自动执行的方法。 一、什么是定时器 在C#中,定时器是一种常用的机制,也就是周期性执行某个指定代码,定时器通常用于需要周期性执行某些操作的场景,例如轮询某个接口获取数据、定时备份数据、定时刷新界面等。在C#中,常用的定时器包括System.Timers.Timer、System.Threading.Timer、System.W…

    C# 2023年6月6日
    00
  • 浅析C#中的AsnycLocal与ThreadLocal

    浅析C#中的AsyncLocal与ThreadLocal 在C#中,当多个线程同时访问同一个变量时,需要使用线程安全的方式保护变量,避免数据竞争。AsyncLocal和ThreadLocal就是两种常用的线程安全技术。 引言 AsyncLocal AsyncLocal是.NET Framework 4.6中引入的一种用于在异步代码中存储和检索数据的新机制。它…

    C# 2023年5月15日
    00
  • C#中执行批处理文件(*.bat)的方法代码

    执行批处理文件是指在C#程序中通过代码来执行批处理文件(*.bat),实现对其他程序或系统命令的控制。下面是执行批处理文件的完整攻略: 1. 利用Process类来执行批处理文件 在C#中,可以使用Process类来启动一个进程并执行批处理文件。Process类提供了Start方法用于启动一个程序,该方法可以接受一个ProcessStartInfo对象作为参…

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