.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#中的Path类可以获取文件的扩展名,同时也可以通过更改文件名的方法来对扩展名进行修改。 获取文件扩展名 使用Path类中的GetExtension()方法获取文件的扩展名,该…

    C# 2023年6月1日
    00
  • C#中Property和Attribute的区别实例详解

    当我们在使用C#编程语言进行开发时,会经常用到Property和Attribute这两个概念,它们虽然有些类似,但是在用法和作用上还是有所区别的。接下来,我将详细讲解C#中Property和Attribute的区别,包括其定义、用法、实例等内容。 Property和Attribute的定义 Property(属性)是一种C#中的成员,它可以让我们在类的外部访…

    C# 2023年5月15日
    00
  • Erlang实现的百度云推送Android服务端实例

    下面我将为您详细讲解“Erlang实现的百度云推送Android服务端实例”的完整攻略。 简介 百度云推送是一款高速、免费、稳定的消息推送服务,可支持Android、iOS、PC、Web等多设备提供消息推送服务。本文将介绍如何使用Erlang实现百度云推送服务的Android端。 准备工作 在开始使用Erlang实现百度云推送服务之前,您需要先完成以下准备工…

    C# 2023年6月3日
    00
  • 代码自动生成工具ASP.NET Maker 2019安装及激活教程(附替换补丁+软件下载)

    ASP.NET Maker 2019是一款用于生成ASP.NET Core MVC、Web API、Web应用程序和移动应用程序的代码自动生成工具。以下是安装和激活教程: STEP 1:下载软件 首先需要从官方网站https://www.hkvstore.com/aspmaker下载ASP.NET Maker 2019安装包。 STEP 2:安装软件 下载完…

    C# 2023年5月31日
    00
  • ASP.NET MVC使用JSAjaxFileUploader插件实现单文件上传

    ASP.NET MVC是一种基于模型-视图-控制器(MVC)模式的Web应用程序框架,它提供了一种简单、灵活和可扩展的方式来构建Web应用程序。JSAjaxFileUploader是一种基于JavaScript的文件上传插件,它可以帮助我们实现单文件上传功能。下面是ASP.NET MVC使用JSAjaxFileUploader插件实现单文件上传的完整攻略: …

    C# 2023年5月12日
    00
  • C#类中方法的执行顺序是什么

    C#中类的方法执行顺序是按照继承层次关系和调用顺序决定的,具体执行顺序如下: 静态构造函数 非静态构造函数 静态方法 非静态方法 其中,静态成员在程序启动时就已经存在,因此静态构造函数是在其他方法之前第一个运行的。而非静态成员只有在实例化对象后才会存在,因此非静态构造函数是在静态构造函数之后但在其他方法之前运行的。 下面是两个简单的例子,说明类中方法的执行顺…

    C# 2023年6月1日
    00
  • C# StackExchange.Redis 用法汇总

    C# StackExchange.Redis 用法汇总 简介 StackExchange.Redis是一种快速、零分配的. NET Redis客户端。 它支持广泛的Redis部署场景,从单机到主从到Redis集群等等。 除了基本Redis功能外,它还提供了批量操作,管道,事务,Lua脚本执行,Pub / Sub,内置的分区支持等功能。 安装 首先安装Stac…

    C# 2023年5月31日
    00
  • C#多线程之线程中止Abort()方法

    下面我将为您详细讲解 “C#多线程之线程中止Abort()方法” 的完整攻略。 什么是Abort()方法 Thread.Abort() 方法是 Thread 类提供的用来终止线程的方法。它是通过引发 System.Threading.ThreadAbortException 异常来终止线程的。 在运行时,当一个线程调用 Abort() 方法时,它本身会向目标…

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