Visual Studio 时间任务不能运行其他任务,但可以

carvr3hs  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(192)

我用Visual Studio 2022社区写了一个ASP.NET系统。但是最近一个功能模块出现了一个奇怪的问题。
这里我有三个计时任务,一个不可控,另外两个任务运行正常。
上次就是这种情况下无法运行,比如这个任务执行系统逻辑,但是没有给用户发消息,我在日志中没有找到相关提示。
下面是我的代码:

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

        try
        {
            LogFile.WriteError(DateTime.Now + "Start");
            var checkWorkInterval = double.Parse((CachedConfigContext.Current.CheckWorkConfig.Interval * 1000).ToString());
            Timer checkWorTime = new Timer(checkWorkInterval);
            checkWorTime.Elapsed += new System.Timers.ElapsedEventHandler(CheckWorkEvent);
            checkWorTime.AutoReset = true;
            checkWorTime.Enabled = Convert.ToBoolean(CachedConfigContext.Current.CheckWorkConfig.MasterSwitch);
        }
        catch (Exception ex)
        {
            LogFile.WriteError(DateTime.Now + "error" + ex.ToString());
        }
    }
    protected void Application_End()
    {
        LogFile.WriteError("Start 0230");
        System.Threading.Thread.Sleep(5000);
        string strUrl = "http://" + Application["WebApiUri_Authority"].ToString() + "/api/Msg/Post";

        string strRec = HttpClientHelper.PostData("", strUrl, "", "", HttpClientHelper.PostContentType.JSON);
    }

    private void CheckWorkEvent(object sender, ElapsedEventArgs e)
    {
        var time = (Timer)sender;
        DateTime nowDate = DateTime.Now;
        try
        {
            DateTime startDate =CachedConfigContext.Current.CheckWorkConfig.StartTime;//22:00
            DateTime endDate =CachedConfigContext.Current.CheckWorkConfig.EndTime;//23:00
            if (startDate <= nowDate && nowDate <= endDate)
            {
                time.Stop();
                LogFile.WriteError(DateTime.Now + "Start");

                var count = checkworkBll.CheckWorkCreate();
                time.Start();
            }
        }
        catch (Exception ex)
        {
            LogFile.WriteError(DateTime.Now + "error" + ex.ToString());
            time.Start();
        }
    }

每次任务停止后,我都试着重新启动程序恢复正常。但过了一段时间,它就会停止运行。我之前重新生成过Bin文件,会不会是这个原因造成的?

lf3rwulv

lf3rwulv1#

我同意PanagiotisKanavos的观点,根据C#的垃圾回收机制,计时器很容易被回收,同时他也在评论中给出了相应的参考资料。
这里我想说的是,除了上述情况外,也可能是因为应用池关闭或回收。
IIS中有两种启动模式:OnDemand启动模式和AlwaysRun启动模式。通常默认启动模式为OnDemand,建议您切换为AlwaysRun启动模式,并将空闲时间设置为0,将启用预加载设置为true,并关闭应用池回收。
您可以参考here了解这两种模式之间的详细区别。
如果它不工作,请让我知道。

相关问题