Domanda

Considera questo codice ...

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

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

Potrebbe essere pericoloso? La memorizzazione nella cache di un timer nell'applicazione per eseguire alcuni lavori in background mentre il sito è in esecuzione sembra sicura, ma mi chiedevo se qualcuno avesse qualche esperienza con questo.

Sono sicuro che scrivere un servizio da eseguire in background sarebbe sicuramente molto meglio, ma a volte non è sempre un'opzione. È un'alternativa?

È stato utile?

Soluzione

Questa sarebbe generalmente una cattiva idea, in quanto System.Threading.Timer utilizza thread da ThreadPool, lo stesso di ASP.Net.

Se per qualsiasi motivo il delegato del timer si blocca o si arresta, il timer inizierà semplicemente un nuovo thread dopo il periodo di timeout, che entra nei thread disponibili per ASP.net.

Se iniziano tutti a bloccarsi, in effetti non sarai in grado di soddisfare altre richieste web (probabilmente una cosa negativa)

Altri suggerimenti

Il problema è che non è garantito che il processo sia ancora attivo. IIS reclamerà il processo sostanzialmente ogni volta che lo desidera, quindi si corre il rischio che non venga eseguito.

Se hai bisogno di fare questo lavoro, allora devi codificarlo in una chiamata web o avere un servizio in esecuzione sullo sfondo del server.

Sarebbe pericoloso in quanto potrebbero esserci momenti in cui il processo di lavoro viene riciclato o AppDomain si arresta in modo anomalo e l'oggetto di lavoro viene ucciso e potresti volerlo recuperare ciò che stava facendo, potrebbe non essere possibile.

Un servizio Windows potrebbe essere OK se riesci a ottenere quell'elemento di lavoro in un servizio. Se è necessario un HttpContext per il lavoro, sebbene si possa desiderare che un servizio Windows chiami un servizio Web per effettuare periodicamente la chiamata che potrebbe funzionare anche se probabilmente non è l'ideale.

Questo ha senso, ma solo per divertimento, cosa succede se il lavoro non deve essere eseguito se il sito viene chiuso? Se è associato all'evento Application_Start e deve essere eseguito solo mentre le persone navigano nel sito, quali sono i rischi a quel punto?

Buone risposte, sono solo un po 'curioso di sapere come funziona all'interno.

Ti consiglio di impostare un'attività pianificata per eseguire una pagina sul tuo sito. Di solito indico l'attività pianificata a un file .vbs con il seguente:

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

Omar Al Zabir ha un eccellente post sull'uso di callback di elementi cache per questo scopo.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top