问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

技巧:.Net框架类库中定时器类的使用[3]

发布网友 发布时间:2023-04-22 12:22

我来回答

1个回答

热心网友 时间:2023-11-10 14:49

  不像我开始描述的两个定时器类 System Threading Timer有四个重载构造函数 就像下面这样

public Timer(TimerCallback callback object state long eTime long period);public Timer(TimerCallback callback object state UInt eTime UInt period);public Timer(TimerCallback callback object state int eTime int period);public Timer(TimerCallback callback object state TimeSpan eTime TimeSpan period);

  第一个参数(callback)要求一个TimerCallback的委托 它指向一个方法 该方法具有下面的结构

  public void TimerCallback(object state);

  第二个参数(state)可以为空或者是包含程序规范信息的对象 在每一个定时器事件被调用时该state对象作为一个参数传递给你的定时回调函数 记住定时回调功能是在一个工作者线程上执行的 所以你必须确保访问state对象的线程安全

  第三个参数(eTime)让你定义一个引发初始定时器事件的时间 你可指定一个 立即开始定时器或者阻止定时器自动的开始 你可以使用System Threading Timeout Infinite常量

  第四个参数(period)让你定义一个回调函数被调用的时间间隔(毫秒) 给该参数定义一个 或者Timeout Infinite可以阻止后续的定时器事件调用

  一旦构造函数被调用 你仍然可以通过Change方法改变eTime和period 该方法有下面四种重载形式

  public bool Change(int eTime int period);public bool Change(uint eTime uint period);public bool Change(long eTime long period);public bool Change(TimeSpan eTime TimeSpan period);

  下面是我在例子程序中用到的开始和停止该定时器的代码

//Initialize the timer to not start automatically System Threading Timer tmrThreadingTimer = newSystem Threading Timer(new TimerCallback(tmrThreadingTimer_TimerCallback) null System Threading Timeout Infinite );//Manually start the timer tmrThreadingTimer Change( );//Manually stop the timer tmrThreadingTimer Change(Timeout Infinte Timeout Infinite);

  正如你所期望的那样 通过选择System Threading Timer类运行例子程序会产生同你看到的System Timers Timer类一样的输出结果 因为TimerCallback功能也是在工作者线程上被调用 没有一个跳动被跳过(假设有工作者线程可用) Figure 显示了例子程序的输出结果

  不像System Timers Timer类 没有与SynchronizingObject相对应的属性被提供 任何请求访问UI控件的操作都必须通过控件的Invoke或BeginInvoke方法被列集

  定时器的线程安全编程

  为了最大限度的代码重用 三种不同类型的定时器事件都调用了同样的ShowTimerEventFired方法 下面就是三个定时器事件的处理函数

private void tmrWindowsFormsTimer_Tick(object sender System EventArgse){ ShowTimerEventFired(DateTime Now GetThreadName());}private void tmrTimersTimer_Elapsed(object sender System TimersElapsedEventArgse){ ShowTimerEventFired(DateTime Now GetThreadName());}private void tmrThreadingTimer_TimerCallback(object state){ ShowTimerEventFired(DateTime Now GetThreadName());}

  正如你所看到的 ShowTimerEventFired方法采用当前时间和当前线程名字作为参数 为了区别工作者线程和UI线程 在例子程序的主入口点设置CurrentThread对象的名字属性为 UIThread GetThreadName帮助函数返回Thread CurrentThread Name值或者当Thread CurrentThread IsThreadPoolThread属性为真时返回 WorkerThread

  因为System Timers Timer和System Threading Timer的定时器事件都是在工作者线程上执行的 所以在事件处理函数中的任何用户交互代码都不是马上进行的 而是被列集等候返回到UI线程上进行处理 为了这样做 我创建了一个ShowTimerEventFiredDelegate委托调用

  private delegate void ShowTimerEventFiredDelegate (DateTime eventTime string threadName); lishixin/Article/program/net/201311/15305
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
5数字寓意是什么意思 如何在 iPhone14上恢复已删除的照片? 红井源 醇香胡麻油 2.5L-购买最佳价格 python如何实现修改当前文件夹下所有文件名称? python遍历输出所有文件 用Python遍历指定文件夹下所有文件 Python:读取指定路径下的文件,含子文件夹,可指定文件类型 谁有治疗网瘾的好方法? 孩子有网瘾又叛逆怎么办 退伍证名字错了怎么办 小学六年级书信作文500字5篇 泡沫灭火器用于扑救什么火灾泡沫灭火器适用于什么火情 oled显示屏不能戴手套操作吗 抖音心情不好的句子 抖音里适合心情低落句子 抖音心情低落说说 抖音心情低落的文案 心情不好难过时发的抖音句子 抖音心情不好的说说短句子 心情低落发抖音配的句子 心情不好难过时发的抖音句子 抖音心情低落的文案 补行驶证在12123上能补吗 酱香型白酒有哪种分类,贵汇名酒系列的酱香酒怎么样? 酱酒的度数是如何分类的? 奥克斯空调拆装奥克斯空调清洗步骤 佛山买房首付多少 苏州外地户口上牌条件 抖音粉丝团在哪里看? 无锡华德仓储设备有限公司怎么样? 2010年执业中药师中药学:外用药——明矾 琵琶弦上说相思—情爱吟咏篇 中西医结合医师药剂学辅导:外用药炉甘石 flink中可以实现每n秒执行一个方法的定时任务吗?使用Java自己的定时操作是失效的 写一个51程序,我想把定时器打开,并且每100ms计数输入的高电平脉冲数。大致框架应该怎么写 笔记本开机只停留在windowsxp界面无法重装系统无法进入pe 电脑重装系统xp的进不去pe选择不进pe安装又做不了系统如何格式c盘 福州装饰公司哪家好怎么选择福州家装公司 福州装修公司哪个靠谱让您省心省力的满意装修 福州鼓楼装修公司排名5家口碑较好的装修公司推荐 福州家装设计有哪些风格 福州凡克.品象装饰公司怎么样 文化作为一种精神力量,能否在人们认识世界、改造世界的过程中起决定作用? 字谜:再次拒绝(打一字) 梦见再次拒绝朋友的追求的预兆 梦见旧情人再次拒绝我的预兆 电路交换网络的基本结构 滨州职业学院单招有学前教育专业吗 红象牌榴莲千层蛋糕好吃吗 早上食用燕窝后,在下午食白萝卜会把燕窝功能解掉吗? 吃燕窝隔8个小时能吃白萝卜吗? 网上买的绿檀木手串每天上油盘怎么变得黑不溜秋的? 百家姓排名表前100