MVC 5 - Ninject - 任务线程奇怪运行

时间:2016-02-25 13:44:00

标签: c# asp.net-mvc ninject

我有一个线程可以在特定时间发送事件来运行程序。

我确实希望网站能够完全控制流程,这就是为什么我将它作为一个循环的长期线程构建到网站中的原因。

问题是我计划在特定时间执行任务,它几乎是随机发生的(可能是在我加载页面时)。看起来好像Web应用程序在使用它之前会睡眠所有线程。

以下是代码:

public void run()
    {
        Task.Factory.StartNew(() =>
        {
            while (true)
            {
                var lastDate = InternalEventLogger.GetLastDateTime();
                if (DateTime.Now >= lastDate.AddDays(1))
                {
                    System.Diagnostics.Debug.WriteLine(DateTime.Now);
                    System.Diagnostics.Debug.WriteLine(lastDate.AddDays(1));
                    InternalEventLogger.RefreshLog();
                }
                bool needUpdate = false;
                System.Diagnostics.Debug.WriteLine("this");
                List<Event> tempList = new List<Event>(this.evtList.getList());
                foreach (Event evt in this.evtList.getList())
                {
                    if (!evt.status.Equals("success"))
                        continue;
                    if (evt.nextRun <= DateTime.Now)
                    {
                        var tempEvt = evt;
                        System.Diagnostics.Debug.WriteLine("time to run: "+evt.name);
                        tempList.Remove(evt);
                        tempEvt.nextRun = evt.nextRun.AddMinutes(evt.interval);
                        tempEvt.lastRan = DateTime.Now;
                        tempList.Add(tempEvt);
                        needUpdate = true;
                        if (tempEvt.runLocation != null) 
                        Task.Factory.StartNew(() =>
                        {
                            Process p = new Process();
                            p.StartInfo.FileName = tempEvt.runLocation;
                            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                            p.Start();
                            string output = p.StandardOutput.ReadToEnd();
                            string err = p.StandardError.ReadToEnd();
                            InternalEventLogger.WriteLog(output);
                            InternalEventLogger.WriteLog("// ------------- ERROR -------------- \n" + err);
                            p.WaitForExit();
                        });
                    }
                }
                if (needUpdate)
                {
                    this.evtList.setList(tempList);
                    this.evtList.serialize(ConfigurationManager.AppSettings["xmlEventLocation"]);
                }
                Thread.Sleep(10000);
            }
        }, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
    }

来自:

 private static void RegisterServices(IKernel kernel)
    {
        evtManager = new EventManager(ConfigurationManager.AppSettings["xmlEventLocation"]);
        evtManager.run();
        // Initalize Event Logger
        new InternalEventLogger();
    }        

这是一张显示时间问题的图片: enter image description here

更新

尝试了以下设置但仍然无法正常工作!

只有在访问时才开始执行任务。

enter image description here

2 个答案:

答案 0 :(得分:0)

您的IIS Web服务器设置可能存在问题。 IIS应用程序池具有参数(在高级设置中):空闲超时(分钟)。默认情况下,此设置为20分钟。因此,如果在20分钟内没有对网站进行查询,则Web服务器会停止应用程序池进程。

Idle Time-out参数说明。 链接到Microsoft Technet

答案 1 :(得分:0)

IIS上的回收计时器需要更改设置。