iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c#线程定时器System.Threading.Timer的使用
  • 164
分享到

c#线程定时器System.Threading.Timer的使用

摘要

System.Threading.Timer 是由线程池调用的。 所有的Timer对象只使用了一个线程来管理。这个线程知道下一个Timer对象在什么时候到期。下一个Timer对象到期

System.Threading.Timer 是由线程池调用的。

所有的Timer对象只使用了一个线程来管理。这个线程知道下一个Timer对象在什么时候到期。下一个Timer对象到期时,线程就会唤醒,在内部调用ThreadPool 的 QueueUserWorkItem,将一个工作项添加到线程池队列中,使你的回调方法得到调用。如果回调方法的执行时间很长,计时器可能(在上个回调还没有完成的时候)再次触发。这可能造成多个线程池线程同时执行你的回调方法。

参数

  • callback : 一个Object 类型参数的委托,周期调用的函数。
  • state: callback 委托调用时的参数。
  • dueTime: 定时器延时多久开始调用。单位 毫秒
  • period: 定时器每隔多久调用一次。单位 毫秒

不能使用局部变量来创建指向一个线程定时器。因为局部变量会被GC回收,导致定时器失效。
比如下面的例子:

		static void Main(string[] args) {

            Run();

            //为了加快GC垃圾回收,不停的创建对象
            for (int i = 0; i < 10000; i++) {
                cc tmp = new cc();
                Thread.Sleep(10);
            }

            Console.ReadKey();

        }

        static int id;

        static void Run() {
            Timer timer = new Timer(DoTime, null, 500, 500);
        }

        static void DoTime(object obj) {
            Console.WriteLine(id++);
        }

        class cc{ 
            public int[] a = new int[1000];
            }

在这里插入图片描述

定时器执行4次后停止了。定时器什么时候停止取决于GC什么时候回收。如果一直没有GC的回收,那么将会一直执行下去。比如把上方创建 cc 对象的代码删除。定时器将会一直执行。

可以在Main方法中使局部变量 或者 使用全局变量来存放Timer 对象 避免 clr 把Timer 回收。

比如改成这样

        static Timer timer;

        static void Main(string[] args) {

            timer =  new Timer(DoTime, null, 500, 500);

            //为了加开GC垃圾回收,不停的创建对象
            for (int i = 0; i < 10000; i++) {
                cc tmp = new cc();
                Thread.Sleep(10);
            }

            Console.ReadKey();

        }

        static int id;

        static void DoTime(object obj) {
            Console.WriteLine(id++);
        }

如果回调方法的执行时间很长,计时器可能(在上个回调还没有完成的时候)再次触发。这可能造成多个线程池线程同时执行你的回调方法。

	    static Timer timer1;

        static void Main(string[] args) {

            timer1 = new Timer(DoTime, 1, 500, 500);


            Console.ReadKey();

        }

        static int id;

        static void DoTime(object obj) {
            int idx = id ++;
            Console.WriteLine("处理开始:" + idx + "," + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(1200);
            Console.WriteLine("处理完毕:" + idx + "," + Thread.CurrentThread.ManagedThreadId);
        }

在这里插入图片描述

定时器第一次任务还没执行完毕,第二次,第三次回调就开始了。多个线程同时并发 DoTime 方法

解决方法

period 使用 Timeout.Infinite。这个参数将导致DoTime 只处理一次。
在回调方法中使用 Change方法来修改 dueTime,period 参数。period 继续使用 Timeout.Infinite. 使用这个方法要注意如果timer 在被Dispose了,使用Change 将会引发异常。
比如

 		static Timer timer1;

        static void Main(string[] args) {

            timer1 = new Timer(DoTime, 1, 0, Timeout.Infinite);

            Console.ReadKey();

        }

        static int id;

        static void DoTime(object obj) {
            int idx = id ++;
            Console.WriteLine("处理开始:" + idx + "," + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(1200);
            Console.WriteLine("处理完毕:" + idx + "," + Thread.CurrentThread.ManagedThreadId);
            timer1.Change(500,Timeout.Infinite);
        }

在这里插入图片描述

使用Disponse停止定时器
如果Timer 不会再使用 则可以 使用 Dispose 方法来停止定时器。
如果定时器运行到中途。使用Dispose方法后,callback还是会执行完一个完整的生命周期,不会中途停止。并且Dispose方法不会等待 callback的这次调用完成。只是定时器下次不再调用 callback。

使用Change停止定时器
把 dueTime 参数置为-1就可以停止定时器。同样的,它不会中断在运行中的callback,只是下一次不再回调。 这个方法停止的定时器 还可以使用Change 再次利用定时器。

到此这篇关于C# 线程定时器 System.Threading.Timer的使用的文章就介绍到这了,更多相关c# 线程定时器 System.Threading.Timer内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: c#线程定时器System.Threading.Timer的使用

本文链接: https://www.lsjlt.com/news/194345.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c#线程定时器System.Threading.Timer的使用
    System.Threading.Timer 是由线程池调用的。 所有的Timer对象只使用了一个线程来管理。这个线程知道下一个Timer对象在什么时候到期。下一个Timer对象到期...
    99+
    2023-02-06
    c# 线程定时器 System.Threading.Timer c# 线程定时器 c# System.Threading.Timer
  • C#Quartzs定时器的使用教程
    目录前言实现步骤前言 首先想到倒计时,定时任务。大家想到的肯定就是定时器。那么定时器在web和winfrom程序中有着很大的作用。那在服务器端有没有像定时器一样的存在呢。 有了这些需...
    99+
    2024-04-02
  • linux多线程定时器如何使用
    在Linux上使用多线程定时器,可以使用以下步骤:1. 包含必要的头文件:```c#include #include #includ...
    99+
    2023-10-09
    linux
  • 如何使用Qt实现线程与定时器
    这篇文章主要介绍如何使用Qt实现线程与定时器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、定时器QTimer类The QTimer class provides repetitive and single-sho...
    99+
    2023-06-26
  • C#线程绑定ThreadLocal类怎么使用
    本篇内容主要讲解“C#线程绑定ThreadLocal类怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#线程绑定ThreadLocal类怎么使用”吧!在.Net 4.0的Thread里,...
    99+
    2023-07-02
  • Java使用线程池执行定时任务
    目录1.schedule2.scheduleAtFixedRate3.scheduleWithFixedDelay总结前言: 在 Java 语言中,有两个线程池可以执行定时任务:Sc...
    99+
    2024-04-02
  • C#中Timer定时器类的简单使用
    目录System.Timers.Timer定时器简单使用设置初始属性简单示例–借用官方示例System.Timers.Timer 定时器就是经过固定时间,执行固定任务。 ...
    99+
    2024-04-02
  • SpringBoot中定时任务@Scheduled的多线程使用详解
    目录一、@Scheduled注解简介二、@Scheduled的多线程机制三、@Scheduled的多线程问题四、@Scheduled加入线程池来处理定时任务五、@Scheduled详...
    99+
    2023-05-17
    SpringBoot定时任务@Scheduled原理 SpringBoot定时任务@Scheduled使用 SpringBoot定时任务@Scheduled
  • 详解Python的多线程定时器threading.Timer
    threading.Timer 一次timer只生效一次,不会反复循环,如果实现循环触发,代码如下: import time import threading def createT...
    99+
    2024-04-02
  • C#中的Timer定时器类如何使用
    本文小编为大家详细介绍“C#中的Timer定时器类如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#中的Timer定时器类如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。System.Timers...
    99+
    2023-06-30
  • c语言线程编程是什么(c中线程的使用)
    C语言线程编程是指在C语言中使用多线程技术,通过创建和管理多个线程来实现并发执行的程序。在C语言中,可以使用线程库(如pthread...
    99+
    2023-09-22
    c语言
  • Java多线程之定时器Timer的实现
    目录标准库中的Timer模拟实现Timer标准库中的Timer 标准库中有一个Timer类,java.util.Timer,核心方法为schedule,schedule有两个参数,第...
    99+
    2022-11-13
    Java 多线程 定时器Timer Java 定时器Timer Java 定时器
  • Java多线程案例之定时器
    文章目录 一. 定时器概述1. 什么是定时器2. 标准库中的定时器 二. 定时器的简单实现 一. 定时器概述 1. 什么是定时器 定时器是一种实际开发中非常常用的组件, 类似于一个 “...
    99+
    2023-09-10
    java 定时器 Timer 多线程 线程安全
  • C# Quartzs定时器的使用方法是什么
    这篇文章主要介绍“C# Quartzs定时器的使用方法是什么”,在日常操作中,相信很多人在C# Quartzs定时器的使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#&nb...
    99+
    2023-06-21
  • Qt实现线程与定时器的方法
    目录一、定时器QTimer类二、在多线程中使用QTimer1.错误用法2.正确用法一3.正确用法二一、定时器QTimer类 The QTimer class provides rep...
    99+
    2024-04-02
  • C++多线程std::call_once的使用
    在多线程的环境下,有些时候我们不需要某个函数被调用多次或者某些变量被初始化多次,它们仅仅只需要被调用一次或者初始化一次即可。很多时候我们为了初始化某些数据会写出如下代码,这些代码在单...
    99+
    2024-04-02
  • 线程池与定时任务如何在Spring中使用
    这篇文章将为大家详细讲解有关线程池与定时任务如何在Spring中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.功能介绍Spring框架提供了线程池和定时任务执行的抽象接口:TaskE...
    99+
    2023-05-31
    spring 线程池
  • python多线程中的定时器你了解吗
    定时器 定时器:每隔一段时间启动一次线程 threading.Timer创建的是一个线程!定时器基本上都是在线程中执行 创建定时器: threading.Timer(interval...
    99+
    2024-04-02
  • python通过线程实现定时器timer
    下面介绍以threading模块来实现定时器的方法。  使用前先做一个简单试验:  import threading def sayhello():         print "hell...
    99+
    2023-01-31
    定时器 线程 python
  • Java多线程如何实现定时器
    这篇文章主要讲解了“Java多线程如何实现定时器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程如何实现定时器”吧!一. 定时器概述1. 什么是定时器定时器是一种实际开发中非常常...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作