ASP.NET и таймеры - PullRequest
       32

ASP.NET и таймеры

1 голос
/ 23 сентября 2008

Рассмотрим этот код ...

using System.Threading;
//...
Timer someWork = new Timer(
    delegate(object state) {
        //Do some work here...
    },
    null, 0, 60000);

HttpContext.Current.Application["SomeWorkItem"] = someWork;

Может ли это быть опасно? Кэширование таймера в Приложении для выполнения некоторой работы в фоновом режиме, пока ваш сайт работает, кажется безопасным, но я задавался вопросом, есть ли у кого-нибудь такой опыт.

Я уверен, что написание службы для запуска в фоновом режиме, безусловно, было бы намного лучше, но иногда это не всегда возможно. Это альтернатива?

Ответы [ 6 ]

3 голосов
/ 23 сентября 2008

Как правило, это плохая идея, поскольку System.Threading.Timer использует потоки из ThreadPool, так же, как ASP.Net.

Если по какой-либо причине ваш делегат таймера блокирует или останавливает работу, таймер просто начнет новый поток после истечения времени ожидания, который переходит в потоки, доступные для ASP.net.

Если все они начнут блокироваться, фактически вы не сможете обслуживать больше веб-запросов (вероятно, плохо)

3 голосов
/ 23 сентября 2008

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

Если вам нужна эта работа, вам нужно либо закодировать ее в веб-вызов, либо запустить службу в фоновом режиме сервера.

1 голос
/ 23 сентября 2008

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

Служба Windows может быть в порядке, если вы можете передать этот рабочий элемент в службу. Если для работы требуется HttpContext, хотя вам может потребоваться, чтобы служба Windows вызывала веб-службу, чтобы периодически выполнять вызов, который может работать, хотя, вероятно, не идеально.

0 голосов
/ 21 октября 2008

У Омара Аль Забира есть отличная статья об использовании обратных вызовов элементов кэша для этой цели.

http://www.codeproject.com/KB/aspnet/ASPNETService.aspx?fid=229682&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=1334820

0 голосов
/ 23 сентября 2008

Я бы порекомендовал вам настроить запланированное задание для запуска страницы на вашем сайте. Я обычно указываю запланированное задание на файл .vbs со следующим:

On Error Resume Next
Dim objRequest
Dim URL

Set objRequest = CreateObject("Microsoft.XMLHTTP")
URL = "http://www.mywebsite.com/cron/pagetorun.ashx"

objRequest.open "POST", URL , false

objRequest.Send

Set objRequest = Nothing
0 голосов
/ 23 сентября 2008

Это имеет смысл, но просто для удовольствия, что, если работа не должна запускаться, если сайт закрывается? Если он связан с событием Application_Start и должен запускаться только во время просмотра сайта, каковы риски в этот момент?

Хорошие ответы, мне просто интересно узнать, как это работает внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...