Длительный фоновый процесс в ASP.NET - Application_Start или отдельный процесс? - PullRequest
10 голосов
/ 06 декабря 2011

Я занимаюсь разработкой приложения .NET 4, которое требует запуска рабочего потока бэкэнда. Этот поток состоит в основном из следующего кода:

while (true) {
    //Check stuff in database
    //Do stuff
    //write to database / filesystem
    Thread.sleep(60000)
}

Приложение ASP.NET - это всего лишь интерфейс для базы данных.

Мой вопрос о том, где лучше всего разместить этот рабочий цикл. Похоже, что я выбрал бы два варианта: (1) выделить его из метода Application_Start и просто запустить, или (2) связать его в отдельный процесс (служба Windows?)

(1), очевидно, потребуется некоторая логика в коде ASP.NET, чтобы проверить, что он все еще работает, поскольку IIS может его убить. Это также довольно аккуратно, поскольку вся логика приложения находится в одном легко развертываемом пакете. (2) гораздо более сегрегированный, но чувствует себя намного более грязным.

Какой лучший подход?

Ответы [ 2 ]

14 голосов
/ 06 декабря 2011

Я бы настоятельно хотел воспользоваться услугой Windows, если это возможно.Фоновый поток в ASP.NET поставляется с большим количеством багажа .

  1. Срок службы фонового процесса зависит от IIS.Если IIS решит, что пора утилизировать пул приложений, фоновый процесс перезапустится.Если IIS решит остановить пул приложений из-за неактивности, ваш фоновый процесс не запустится.
  2. Если IIS настроен для работы в качестве веб-сада (несколько процессов на AppPool), тогда ваш фоновый поток может работать больше, чемодин раз.
  3. Позже, если вы решите сбалансировать нагрузку на свой веб-сайт (несколько серверов, на которых работает сайт), вам, возможно, придется изменить приложение, чтобы фоновые потоки выполнялись только на одном сервере).

И многое другое.

0 голосов
/ 19 января 2017

Рассмотрим что-нибудь простое, например Hangfire , а затем подумайте о точках дизайна в этом связанном ответе .

...