Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

Я бы порекомендовал вам настроить запланированное задание для запуска страницы на вашем сайте.Обычно я указываю запланированную задачу на файл .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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top