• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
泛舟
欲穷千里目,更上一层楼
博客园    首页    新随笔    联系   管理    订阅  订阅

System.Threading.Timer使用注意的地方

System.Threading.Timer : 提供以指定的时间间隔执行方法的机制。 此类不能被继承。 其中一个构造方法: public Timer( TimerCallback callback, Object state, long dueTime, long period ) 参数 callback类型:System.Threading.TimerCallback 一个 TimerCallback 委托,表示要执行的方法。 state类型:System.Object 一个包含回调方法要使用的信息的对象,或者为 null。 dueTime类型:System.Int64 调用 callback 之前延迟的时间量(以毫秒为单位)。指定 Timeout.Infinite 可防止启动计时器。指定零 (0) 可立即启动计时器。 period类型:System.Int64 调用 callback 的时间间隔(以毫秒为单位)。指定 Timeout.Infinite 可以禁用定期终止。--摘自 msdn :http://msdn.microsoft.com/zh-cn/library/vstudio/saba8ksx.aspx在具体使用中需要注意的其备注:(1)如果希望将 Timer 对象本身用作状态对象,可调用此构造函数。创建计时器后,使用 Change 方法设置间隔时间和到期时间。 (2)只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。 (3)当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。请注意,回调可能发生在 Dispose() 方法的重载被调用之后,因为计时器是按线程池线程来安排回调的执行的。可使用 Dispose(WaitHandle) 方法重载进行等待,直到完成所有的回调。 (4)由计时器执行的回调方法应该是可重入的,因为它是在 ThreadPool 线程上调用的。在以下两种情况中,此回调可以同时在两个线程池线程上执行:一是计时器间隔小于执行此回调所需的时间;二是所有线程池线程都在使用,此回调被多次排队。 --摘自 msdn:http://msdn.microsoft.com/zh-cn/library/vstudio/system.threading.timer.aspx 根据这些注意项(1)(2)如此使用Timer: class Program { public static int RunTimes = 0; static void Main(string[] args) { Timer t = new Timer(StartCrawl); //change会重启timer , t.Change(0, 3*1000); //主线程阻塞,防止timer被回收(只要在使用 Timer,就必须保留对它的引用。) Thread.Sleep(3000 * 1000); Console.ReadKey(); } public static void StartCrawl(object stateInfo) { /** * do something here **/ //change next loop Timer t = stateInfo as Timer; if (RunTimes == 0) { t.Change(10 * 100, 10 * 1000);// 第1次为重启timer,之后按每10秒执行 time } Console.WriteLine(string.Format( "Crawling:{0}",RunTimes++)); } } System.Threading.Timer : 提供以指定的时间间隔执行方法的机制。 此类不能被继承。 其中一个构造方法: public Timer( TimerCallback callback, Object state, long dueTime, long period ) 参数 callback类型:System.Threading.TimerCallback 一个 TimerCallback 委托,表示要执行的方法。 state类型:System.Object 一个包含回调方法要使用的信息的对象,或者为 null。 dueTime类型:System.Int64 调用 callback 之前延迟的时间量(以毫秒为单位)。指定 Timeout.Infinite 可防止启动计时器。指定零 (0) 可立即启动计时器。 period类型:System.Int64 调用 callback 的时间间隔(以毫秒为单位)。指定 Timeout.Infinite 可以禁用定期终止。--摘自 msdn :http://msdn.microsoft.com/zh-cn/library/vstudio/saba8ksx.aspx在具体使用中需要注意的其备注:(1)如果希望将 Timer 对象本身用作状态对象,可调用此构造函数。创建计时器后,使用 Change 方法设置间隔时间和到期时间。 (2)只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。 (3)当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。请注意,回调可能发生在 Dispose() 方法的重载被调用之后,因为计时器是按线程池线程来安排回调的执行的。可使用 Dispose(WaitHandle) 方法重载进行等待,直到完成所有的回调。 (4)由计时器执行的回调方法应该是可重入的,因为它是在 ThreadPool 线程上调用的。在以下两种情况中,此回调可以同时在两个线程池线程上执行:一是计时器间隔小于执行此回调所需的时间;二是所有线程池线程都在使用,此回调被多次排队。 --摘自 msdn:http://msdn.microsoft.com/zh-cn/library/vstudio/system.threading.timer.aspx 根据这些注意项(1)(2)如此使用Timer: class Program { public static int RunTimes = 0; static void Main(string[] args) { Timer t = new Timer(StartCrawl); //change会重启timer , t.Change(0, 3*1000); //主线程阻塞,防止timer被回收(只要在使用 Timer,就必须保留对它的引用。) Thread.Sleep(3000 * 1000); Console.ReadKey(); } public static void StartCrawl(object stateInfo) { /** * do something here **/ //change next loop Timer t = stateInfo as Timer; if (RunTimes == 0) { t.Change(10 * 100, 10 * 1000);// 第1次为重启timer,之后按每10秒执行 time } Console.WriteLine(string.Format( "Crawling:{0}",RunTimes++)); } }
posted @ 2012-12-07 20:05  7goal  阅读(524)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3