在体系开发过程中常常用到守时器进行守时处理,比方比较常见的邮件群发、实时更新论坛的在线人数、文章数、点击率等。 许多情况下,咱们不能对某一状况或许某一行为进行实时监控,所以就期望体系能够完成这一功用。经过多线程技能能够使得守时器的功能更高。
虽然守时器能够主动处理或许一些批处理操作,可是守时器也给体系带来必定的安全隐患,特别是当守时进行的操作呈现bug时,假如没有对Exception做出及时的处理,体系资源将会大大的糟蹋,严峻的情况下,或许导致体系溃散。因而,关于守时器的运用必定要稳重,至少要确保守时处理的行为呈现异常的或许性很小,并在呈现Exception的情况下及时处理。
System.Threading.Timer 是一个十分常用的守时器类,是一个运用回调办法的计时器,并且由线程池线程服务,简略且对资源要求不高。
public Timer (
TimerCallback callback,
Object state,
TimeSpan dueTime,
TimeSpan period
)
参数
callback
一个 TimerCallback 托付,表明要履行的办法。
state
一个包含回调办法要运用的信息的目标,或许为 空引证(在 Visual Basic 中为 Nothing)。
dueTime
TimeSpan,表明在 callback 参数调用它的办法之前推迟的时刻量。指定 -1 毫秒以避免发动计时器。指定零 (0) 以当即发动计时器。
period
在调用 callback 所引证的办法之间的时刻距离。指定 -1 毫秒能够禁用定时停止。
办法、原理
运用 TimerCallback 托付指定时望 Timer 履行的办法。计时器托付在结构计时器时指定,并且不能更改。此办法不在创立计时器的线程上履行,而是在体系供给的 ThreadPool 线程上履行。
创立计时器时,能够指定在第一次履行办法之前等候的时刻量(截止时刻)以及尔后的履行期间等候的时刻量(时刻周期)。能够运用 Change 办法更改这些值或禁用计时器。
当不再需求计时器时,请运用 Dispose 办法开释计时器持有的资源。假如期望在计时器被开释时接收到信号,请运用承受 WaitHandle 的 Dispose(WaitHandle) 办法重载。计时器已被开释后,WaitHandle 便停止。
由计时器履行的回调办法应该是可重入的,由于它是在 ThreadPool 线程上调用的。
补白:
在超越 dueTime 今后及尔后每隔 period 时刻距离,都会调用一次 callback 参数所指定的托付。
假如 dueTime 为零 (0),则当即调用 callback。假如 dueTime 是 -1 毫秒,则不会调用 callback;计时器将被禁用,但经过调用 Change 办法能够从头启用计时器。
假如 period 为零 (0) 或 -1 毫秒,并且 dueTime 为正,则只会调用一次 callback;计时器的定时行为将被禁用,但经过运用 Change 办法能够从头启用该行为。
最简略的守时器
using System;
using System.Threading;
public class TestTimer
{
/**////
/// 守时器
///
private Timer iTimer;
/**////
/// constructor
///
public TestTimer()
{
iTimer = new System.Threading.Timer(new TimerCallback(Doing));
iTimer.Change(TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
}
/**////
///
///
///
public void Doing(object nObject)
{
//do something
}
}
一个比较完好的计时器:
下面是我规划的一个简略实例。在一个问卷调查体系中,每一张问卷都有其停止日期,当抵达了停止日期时,需求体系主动将其封闭。这就需求守时器对问卷的状况和停止日期进行实时监控,及时封闭。这儿采用了一个简略的单件形式来操作、操控守时器。 这儿首要的操作包含守时器开端、停止、履行一次。
PaperManager管理类
/**////
/// 管理类
///
public class PaperManager
{
/**////
/// 守时器
///
private Timer iTimer;
/**////
/// 发动时刻
///
private TimeSpan dueTime;
/**////
/// 办法调用距离
///
private TimeSpan period;