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(); // 这是我要定点完成的工作 } }