tnblog
首页
视频
资源
登录

ASP.NET Timer细节处理

1585人阅读 2018/12/14 11:05 总访问:1585 评论:0 收藏:0 手机
分类: 细节处理


        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);

                }

            }

        }



唉,不说了。都是泪,一句话:细心总是好的,希望大家不要学我了。特别强调都是由于我的粗心而掉下的坑,吃黄连去了




评价
擎苍天,踏日月,万古无敌于世间的安澜--- 余陀救我
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
欢迎加群交流技术