global.asax不在空闲时间工作

时间:2017-08-10 05:30:47

标签: c# asp.net .net asp.net-mvc global-asax

我正在研究mvc中的global.asax,我面临的问题是,我已经设置了一个调度程序来启动全局并且它运行良好但是在启动全局后我获得了数据,但是假设数据不可用到下一个20分钟的全球进程已经停止。现在20分钟后数据来自服务器,但全局停止,所以我无法从全球获取数据。现在的问题是,我怎样才能将全球流程的时间增加到60分钟或者什么......或者当数据出现时全局如何开始。

这是我的代码

  protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);


        System.Timers.Timer timer = new System.Timers.Timer();
        timer.Interval = 300 * 1000;                 //60*1000 means 1 min 
        //timer.Enabled = true;
        timer.Elapsed +=new System.Timers.ElapsedEventHandler(Daily_Attendance_RFID);
        timer.Start();
        Application.Add("timer", timer);

    }

    static void Daily_Attendance_RFID(object sender, System.Timers.ElapsedEventArgs e)
    {
        //***   For RFID Attendance Function   ***//
        Daily_Attendance.Daily_Attendance_RFID();
    }

1 个答案:

答案 0 :(得分:6)

简短版:

  

您应该在托管环境下拥有计时器。这是一个不好的做法,期间。

长版:

这样做的原因在于ASP.NET的启动方式,以及"为什么"事情就在今天。但我会尽力用我所掌握的一点点知识来解释......两个要点需要考虑:

  1. 您的应用程序(至少最终......)在IIS进程下运行,这是一个Windows服务(World Wide Publishing Service - W3SVC)。 IIS(或更好的说:W3SVC.exe进程..)是您的托管环境,它使用应用程序池运行每个应用程序/网站。每个应用程序池都可以运行1个(或更多)w3wp.exe进程(很高兴知道:如果有多个w3wp处理该应用程序池 - 他们将该池称为Web Garden ..)

  2. 通常,在Windows下运行的任何进程都有1(或更多......)AppDomain。每个AppDomain都有一个包含所有静态变量或线程或线程相关资源的作用域会话。

  3. 在你的情况下 - Timer 使用线程/锁来在时间到来时经过回调委托..所以你初始化Timer 的环境很重要。如果这是一个STA / MTA环境(Windows / GUI应用程序或服务) - 无论如何 - 你可以有一个Timer,因为你的应用程序(通常是......)在1个进程下运行 - 并且那个进程(通常是... 。)获得一个AppDomain。

    在托管环境下初始化长时间运行的后台进程(如等待经过回调的线程 - 或Timer ..)的另一个缺点是 - 外部环境可以控制应用程序生命周期。它可能会将其关闭,或者将其置于空闲状态(How to configure Idle settings in IIS),因为各种原因可能因机器而异。举个例子:有人可能只是回收运行你的应用程序的应用程序池,以及你的计时器将消失,并重新初始化..

    <强>建议:

      

    如果可以 - 将Timer逻辑分离为Windows服务。如果不是 - 请尝试使用任务计划程序,例如FluentSchedulerQuartz等等。