zoukankan      html  css  js  c++  java
  • 『C#基础』多线程笔记「三」计时器

    在多线程中,有一个比较特殊的应用,就是计时器(Timer)。我在之前的一篇笔记中说过关于Timer控件的简单用法,这里我再根据一些新找的的内容,进行一些整理与扩展。

    『WPF』Timer的使用

    命名空间:

    1. System.Timers.Timer
    2. System.Threading.Timer
    3. System.Windows.Forms.Timer
    4. System.Web.UI.Timer

    这里可以看出,基本上每一个大类的应用都有其自己的Timer。而在这四个不同的Timer命名空间中的Timer中,在基础用法上,并没有看到有什么特殊的不同。

    无论什么Timer,其最主要的还是Elapsed事件,与Start、Stop这两个方法。当然,还有多线程环境下的问题。

    由于每一次当Timer的时间间隔到的时候,都会引发Elapsed事件,然后我们就可以在这个事件中写入相应的操作,来完成我们想要完成的任务了。

    由于,每一次都会新开启一个线程来执行Elapsed事件中的操作,所以,在使用Timer的时候,就像之前的笔记中记录的一样,对于共享资源的同步上要进行相应的同步处理才好。不然就会引起不可预知的问题。

    在使用Timer的时候,还要注意的是对于时间间隔的控制,这主要涉及到的CPU与内存的问题。

    如果我们所要执行的操作很多,而时间间隔又设置的很短的话,就会造成不断的开启线程,并且不断的执行操作的问题。不断的开启线程,就会造成内存越来越多的问题,这里如果处理不好,很可能会导致整个系统的崩溃,而且在一旦这些操作中,有写入资源的操作,那么还很有可能造成死锁的情况。

    所以在设计Timer的时候,一定要明确这样几件事情:

    1. 要定时执行的操作,一定要尽可能的短
    2. 如果有必要,就对Timer的正在执行的数量进行一定的控制
    3. 一定要有资源同步的控制,最起码,要有对同一个操作进行完结性检查后,再去执行

     

    「MSDN示例」


     

    「MSDN示例」

    「MSDN示例」

  • 相关阅读:
    android 本地字符串存取
    2020-07-17:线上一个服务有4个实例突然变得访问很慢,你会从什么地方入手找原因?
    2020-07-16:如何获得一个链表的倒数第n个元素?
    2020-07-15:死锁与活锁的区别,死锁与饥饿的区别?
    2020-07-14:es用过冷热分离吗?假如现在有些数据热变冷,有些数据冷变热,怎么解决?
    2020-07-28:已知sqrt (2)约等于 1.414,要求不用数学库,求sqrt (2)精确到小数点后 10 位。
    2020-07-29:从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?
    2020-07-27:如何设计一个分布式文件系统,如何设计动态扩容和数据定位?
    2020-07-26:如何用 socket 编程实现 ftp 协议?
    2020-07-25:如何实现一个高效的单向链表逆序输出?
  • 原文地址:https://www.cnblogs.com/sitemanager/p/2422953.html
Copyright © 2011-2022 走看看