asp.net定点执行任务总结2011-09-02 博客园 小橋流水前两天写了一个定时发送天气预报的程序,老是出现这样或那样的bug,甚至有时候出现拒绝服务的错误。去网上找了一下资料,发现是自己的定点发送存在一定的问题。现在总结一下经验,并和大家一起探讨一下。首先我们要使用global.asax中的事件,在Application_Start事件中启动我们的任务,在Application_End中停止我们的任务。 当然启动我们的任务,必须是启动一个线程去完成相应的工作。开始,我在线程中做的事情是每隔900ms判断一下,当前的事件是否等于指定的时间,如果等于的话,就执行相应的任务,但是这样容易出现的毛病就是访问太频繁了,占用过多的cpu资源。后来,我想到的方法是,计算现在到定点时间的ms数,由以下函数完成:
    private int GetSleepTime(int hour, int min, int second)    {        DateTime now = DateTime.Now;        int sleep = (((hour - now.Hour) * 60 + (min - now.Minute)) * 60 + (second - now.Second)) * 1000;        if (sleep < 0)            sleep += 24 * 3600 * 1000;        return sleep;    }这样直接sleep到指定的事件点就可以了,然后再执行我们的任务。为了能够中途能够认为停止,用sleep就不是很方便了,所以我决定用wait,具体的线程方法如下:
    private void Run()    {        while (isStart)        {            int sleep = GetSleepTime(19, 0, 0);            lock (locker)            {                Monitor.Wait(locker, sleep);            }            if (isStart)                SendWeatherReport(); // 这是我要定点完成的工作        }    }