2016-03-02 3 views
1

У меня есть поток, который запускает события для запуска программ в определенное время.MVC 5 - IIS останавливает задачи Thread

Я хочу, чтобы на веб-сайте был полный контроль над процессом, поэтому я создал его на сайте как длинный поток, который петли.

Проблема заключается в том, что я планировал выполнение задачи в определенное время, и это происходит почти случайно (возможно, когда я загружаю страницу). Кажется, что веб-приложение спит все потоки, пока оно не используется или что-то еще.

Вот код:

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

настроек IIS ниже
только на посетите ли это задачи.

enter image description here

+0

IIS перерабатывает пулы приложений каждые 1740 минут (29 часов) по умолчанию http://stackoverflow.com/questions/13386471/fixing-slow-initial-load-for-iis Может ли это быть причиной вашей проблемы? Если это так, вы можете изменить это в настройках утилизации пула приложений: http://weblogs.asp.net/owscott/why-is-the-iis-default-app-pool-recycle-set-to-1740-minutes – user1666620

ответ

0

Открыть, что настройки диалога в диспетчере IIS. Убедитесь, что:

  1. Start Mode = AlwaysRunning
  2. Idle Тайм-аут (минуты) = 0

для пула приложений вы используете - проверить настройки, так что вы уверены, вы редактируете правильный пул.

Если у вас есть это, ваше приложение должно работать постоянно, но есть еще одна вещь - Утилизация - в нижней части диалогового окна настроек настройте свою переработку так, как вам нужно. Возможно, что у вас все в порядке со значениями по умолчанию, но если вы не знаете об утилизации, это может вас удивить, поэтому убедитесь, что вы это понимаете и настройте параметры по своему усмотрению.

+0

Отключение работа по переработке, это может быть не самое лучшее, что нужно делать, но это простой выход на данный момент. Спасибо –

0

Да, вы правы, хостинг IIS не хранит потоки, так как все веб-приложение должно делать обрабатывать запрос и предоставлять ответ. Если вы хотите запустить задачу по расписанию, вы действительно не должны использовать веб-приложение, так как оно отменяет все фоновые потоки после отправки ответа.

Предлагаю вам изменить свою архитектуру и создать службу Windows (например, демон), которая начнется автоматически после загрузки системы и которая может намного легче управлять запуском события.

Если по какой-либо причине вы хотите использовать веб-интерфейс для такого метода, вы можете использовать привязку WCF между вашим веб-приложением и службой Windows (через TCP/IP или именованные каналы или что-то еще), но ваш подход не будет работать Веб приложение.

Я хотел бы также отметить, что этот код:

while (true) 

это плохая идея - вы должны использовать CancellationToken для задачи в этом случае.

+0

Какое ваше предложение об использовании потока для пользовательских запросов для запуска программы и запланированных прогонов должно быть связано с планировщиком задач Windows, используя api, например http://taskscheduler.codeplex.com/ –

+0

Да, вы можете использовать что-то подобное – VMAtm