Timer的用法:
1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用
2:关于计时有很多中方式,本人学识有限,暂只有一种分享出来
3:一般用于监测某个数据库表,某个功能
4:我这里的是一个监测订单表和库存表,下单通知,和库存预警通知
Timer的写处:
1:若有服务即分布式项目的话:可以将Time写在底层服务里亦可以写在Global.asax文件里面
2:由于我这里的是分布式,所以不写在Service服务里面的
Timer步骤:
注:需要引入服务ServiceBase,不然此处写法不成功。
服务应用:当然这些服务是有人已经写好了,可见:https://www.cnblogs.com/endv/p/6978644.html---服务的搭建
System.Object
?? System.MarshalByRefObject
???? System.ComponentModel.Component
?????? System.ServiceProcess.ServiceBase---继承层次
1:初始化Timer:这里用于全局的,
//计时器
System.Timers.Timer ordertimer ;
2:设置 服务启动方法: protected override void OnStart(string[] args)
ordertimer = new System.Timers.Timer() ;
ordertimer.Interval = 60000; //设置计时器事件间隔执行时间--一分钟查一次
ordertimer.Elapsed += new System.Timers.ElapsedEventHandler(TMStart_Order);--调用方法
ordertimer.Enabled = true;
3:设置自己的方法
private void TMStart_Order(object sender, System.Timers.ElapsedEventArgs e)
{
//-------------------------------启动订单预警监控服务服务-------------------------------
logger.Info("启动未支付订单监控");
//ordertimer.Enabled = true;-------若是ordertimer.Enabled 为true,则会按照设置的 ordertimer.Interval 时间进行执行,若是想要实时查询的话建议设置为false(代表执行一次,建立一个线程),后面会有的。
Thread OrderManager = new Thread(new ThreadStart(执行方法);
OrderManager.Start();
}
4:我的订单执行方法
public void OrderManagerLoop()
{
try
{
MonitoringTimerOrder();---执行操作数据库,监控表等操作
}
catch (ApplicationException ex)
{
logger.Error("监控订单待支付,已付款待发货信息异常:" + ex.Message);
}
}
我的方法是:不需要实时查询,只需一分钟查一次就可以了。
若是先要实时查询的话:只需加入while即可了,前提是timer创建线程后即禁用timer。
如:
public void PromotionMonitoringLoop()
{
--前提是ordertimer.Enabled在方法执行前为false,不然你就等着内存占满,然后凉凉了,此处是一个死循环,进入此循环前需要把timer禁用,不然每隔多少时间就执行一次就有多少个死循环,别说内存了数据库都遭不住这么折腾。
while (true)
{
try
{
PromotionMonitoring();--操作数据库方法
Thread.Sleep(1000);--休眠一秒:表示操作不会并发,然后数据库缓和
}
catch (ApplicationException ex)
{
logger.Error("监控订单待支付,已付款待发货信息异常:" + ex.Message);
Thread.Sleep(1000);
}
}
}
唉,不说了。都是泪,一句话:细心总是好的,希望大家不要学我了。特别强调都是由于我的粗心而掉下的坑,吃黄连去了