每日20行之3~~~ThreadPool之RegisterWaitForSingleObject 自动定时执行(可循环)
来源:互联网 发布:七匣子淘宝 编辑:程序博客网 时间:2024/06/05 00:22
由于昨天晚上服务器更新,更新推迟到今天早上哈。
今天更新的功能还是蛮有趣的,这个方法的作用是向线程池添加一个可以定时执行的方法。
话不多说,我们先来看一下这个功能的API:
public static RegisteredWaitHandle RegisterWaitForSingleObject(
WaitHandle waitObject,
WaitOrTimerCallback callBack,
Object state,
int millisecondsTimeOutInterval,
bool executeOnlyOnce
)
- waitObject:
要注册的 WaitHandle。使用 WaitHandle 而非 Mutex。 - callBack:
waitObject 参数终止时调用的 WaitOrTimerCallback 委托。 - state:
传递给委托的对象。 - timeout:
TimeSpan 表示的超时时间。如果 timeout 为零,则函数测试对象的状态并立即返回。如果 timeout 为 -1,则函数的超时间隔永远不过期。 - executeOnlyOnce:
如果为 true,表示在调用了委托后,线程将不再在 waitObject 参数上等待;如果为 false,表示每次完成等待操作后都重置计时器,直到注销等待。
那么看完上面的解释我相信还是不好看懂的,那么我们来说明一下,首先waitObject就是创建的用于完成这个操作的类:
static ManualResetEvent wait1 = new ManualResetEvent(false);static AutoResetEvent wait2 = new AutoResetEvent(false);
millisecondsTimeOutInterval是用来设置间隔时间;
executeOnlyOnce也很容易理解,那就是是否只执行一次,当值为true时是,当false时否。
那么我们很容易还可以看到一件事,那就是当我们创建ManualResetEvent对象的时候,后面有一个ture或者是False的参数,那么我们怎么来理解呢?
该方法还在此基础上提供了基于信号量来触发执行任务。
信号量也叫开关量,故名思议,它只有两种状态,不是true就是false。
我们可以在将其实例化时指定开关量的初始值。(true为有信号,false为没信号)
ManualResetEvent和AutoResetEvent的区别在于:
前者调用Set方法后将自动将开关量值将 一直保持为true ,后者调用Set方法将变 为true随后立即变为false ,可以将它理解为一个脉冲。
例子一:实现一个普通的定时器
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace test{ class Class14 { static AutoResetEvent wait=new AutoResetEvent(false); static void Main(string[] args) { object state=new object(); ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(test11), state,5000, false); Console.ReadKey(); } private static void test11(object state, bool timedOut) { Console.WriteLine("aaa"); } }}
例子二,使用开关量提前执行下一次任务执行的时间为立即执行(有点绕,就是说原先间隔10s执行下一次任务,但是使用了开关量的set方法,立即执行下一次的任务,执行的时间提前了,下一次执行的时间又重新开始算 在这里请注意一个细节,下面的代码中当我们向线程池中注册任务的语句即 ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(test11), state,5000, false); 它是间隔5秒执行,当刚加入线程池后它是需要过了5秒后才会第一次执行回调函数的,也就是说不是一加入第0秒就会执行一次回调函数的。这里使用了一个 wait.Set()方法使得立即执行了回调函数而不需要等待5秒钟,所以输出结果的第一个“aaa”是由wait.Set()操作引起的。 如果我们不使用wait.Set(),而是将AutoResetEvent wait=new AutoResetEvent(true)的初始值改为true也会在第0秒输出“aaa”
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace test{ class Class14 { static ManualResetEvent wait2=new ManualResetEvent(false); static AutoResetEvent wait=new AutoResetEvent(false); static void Main(string[] args) { object state=new object(); ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(test11), state,5000, false); wait.Set(); Console.ReadKey(); } private static void test11(object state, bool timedOut) { Console.WriteLine("aaa"); } }}
第三个例子:使用ManualResetEvent,这个例子有点意思,它会不停的输出”aaa”,为什么?
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace test{ class Class14 { static ManualResetEvent wait=new ManualResetEvent(true); static void Main(string[] args) { object state=new object(); ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(test11), state,5000, false); Console.ReadKey(); } private static void test11(object state, bool timedOut) { Console.WriteLine("aaa"); } }}
- 每日20行之3~~~ThreadPool之RegisterWaitForSingleObject 自动定时执行(可循环)
- ThreadPool基础之RegisterWaitForSingleObject
- ThreadPool.RegisterWaitForSingleObject
- Flex4之定时器之setInterval应用(定时至某个时间发起,可循环)
- ThreadPool.RegisterWaitForSingleObject 设置等待超时事件
- Tomcat之——宕机自动重启和每日定时启动tomcat
- Tomcat之——宕机自动重启和每日定时启动tomcat
- 定时执行任务之quartz
- Python定时执行之Timer
- Python定时执行之Timer
- boost之ThreadPool
- boost之ThreadPool
- Java多线程之ThreadPool
- Java多线程之ThreadPool
- boost之ThreadPool
- Loki之ThreadPool
- KingDZ 变菜鸟,每日一个C#小实例之---C#开机自动执行程序
- android之定时提醒功能(周循环)
- svn属性svn:keywords与auto-props的配置(运行配置区)
- Codeforces 567D One-Dimensional Battle Ships
- Apache Mahout的Taste基于Hadoop实现协同过滤推荐引擎的代码分析
- php 命令执行系列
- POJ 2014:Flow Layout 模拟水题
- 每日20行之3~~~ThreadPool之RegisterWaitForSingleObject 自动定时执行(可循环)
- HDU1863:畅通工程【Kruskal & Prim】
- HDOJ--1863--畅通工程
- Binary Tree Postorder Traversal
- Android-自定义Dialog
- MySQL学习总结1
- java学习笔记-------对卡片布局管理器的深入理解
- dpkg命令
- 新blog