C# global.asax在空闲时间不工作

C# global.asax在空闲时间不工作,c#,asp.net,.net,asp.net-mvc,global-asax,C#,Asp.net,.net,Asp.net Mvc,Global Asax,我正在mvc中处理global.asax,我面临的问题是,我已经设置了一个调度程序来启动global,它工作得很好,但是在启动global后我得到了数据,但是假设数据在接下来的20分钟内不可用,全局进程已经停止。现在,20分钟后,数据来自服务器,但全局已停止,因此我无法从全局获取数据。现在的问题是,我怎样才能将全局处理的时间增加到60分钟,或者怎样才能在数据到来时启动全局处理 这是我的密码 protected void Application_Start() { Ar

我正在mvc中处理global.asax,我面临的问题是,我已经设置了一个调度程序来启动global,它工作得很好,但是在启动global后我得到了数据,但是假设数据在接下来的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();
    }

短版:

您不应该在托管环境下设置计时器。这是一个坏习惯,句号

长版本:

原因很深,在于ASP.NET是如何开始的,以及“为什么”现在的情况。。但是我会尽我所能用我所掌握的一点知识来解释。。需要考虑的两点:

  • 您的应用程序(至少最终…)在IIS进程下运行,该进程是一个Windows服务(-W3SVC)。IIS(…或者更好地说:W3SVC.exe进程…)是您的托管环境,它使用应用程序池运行每个应用程序/网站。每个应用程序池可以运行1个(或多个)w3wp.exe进程(不太好知道:如果有多个w3wp处理该应用程序池,则称该池为a..)

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

  • 在您的情况下,计时器使用线程/锁在时间到达时通过回调委托。。因此,初始化计时器的环境很重要。如果这是一个STA/MTA环境(Windows/GUI应用程序或服务)-无论如何-您可以有一个计时器,因为您的应用程序(通常…)将在一个进程下运行-并且一个进程(通常…)将拥有一个AppDomain

    在托管环境下初始化长时间运行的后台进程(如等待回调或计时器通过的线程)的另一个缺点是,外部环境可以控制应用程序的生命周期。它可能会关闭它,或将它置于空闲状态(),原因可能因机器而异。。举个例子:有人可能只是简单地回收运行你的应用程序的应用程序池,你的计时器就会消失,然后重新初始化

    建议:

    如果可以-将计时器逻辑分离到Windows服务中。如果没有-尝试使用任务调度器代替,比如,还有更多


    这绝对是安排任务的错误方法。看看Windows服务。实际上我是网络新手,所以你能告诉我什么是正确的方法吗?使用这个库:嘿,谢谢你的回答。我意识到,虽然我知道这是一个糟糕的做法,但我不知道为什么。您能否详细说明一下,在我们的w3wp进程中,由于计时器抓取锁并启动线程,到底会出现什么问题?我的意思是,在我们的ASP.NET应用程序中可能会有很多其他人做同样的事情,为什么只有计时器不好?没问题。回答我:如果IIS决定初始化多个AppDomain,会发生什么情况?这是否意味着您将同时运行两个计时器?如果有超过1个w3wp进程在运行,该怎么办?从应用程序的角度来看,所有这些问题的答案都不清楚。任务调度器也是如此,但它们仍然有一些机制来防止某些情况发生。谢谢,我得到了这个结论:很难控制计时器的生命周期,因为它将与您的web应用程序生命周期相关联,而您的web应用程序生命周期是由IIS以不可预知的方式控制的。